¿Cómo puedo usar std :: shared_ptr para array of double? Además, ¿cuáles son las ventajas/desventajas de usar shared_ptr.Uso de std :: shared_ptr
5
A
Respuesta
9
Depende de lo que está buscando. Si lo que desea es una matriz de tamaño variable de dobles, ir con
std::vector<double>
Ejemplo:
std::vector<double> v;
v.push_back(23.0);
std::cout << v[0];
Si compartir la propiedad de dichos asuntos matriz para que, por ejemplo, utilizar
std::shared_ptr<std::vector<double>>
Ejemplo:
std::shared_ptr<std::vector<double>> v1(new std::vector<double>);
v1->push_back(23.0);
std::shared_ptr<std::vector<double>> v2 = v1;
v2->push_back(9.0);
std::cout << (*v1)[1];
Alternativamente, Boost tiene
boost::shared_array
que sirve a un propósito similar. Ver aquí:
http://www.boost.org/libs/smart_ptr/shared_array.htm
En cuanto a algunas de las ventajas/desventajas de shared_ptr ir:
Pros
- Automatizado compartidas cancelación de asignación de recursos basado en el recuento de referencias - ayuda a evitar pérdidas de memoria y otros problemas asociados con cosas que no se desasignan cuando deberían ser
- Puede hacer que sea más fácil escribir código de excepción
Contras
- sobrecarga de memoria para almacenar el recuento de referencia puede ser significativo para objetos pequeños
- rendimiento puede ser peor que para los punteros primas (pero medir esto)
6
También puede proporcione un array deleter:
template class ArrayDeleter {
public:
void operator() (T* d) const
{ delete [] d; }
};
int main()
{
std::shared_ptr array (new double [256], ArrayDeleter());
}
+1
También podrías usar una lambda, creo: 'std :: shared_ptr
Cuestiones relacionadas
- 1. Uso del eliminador personalizado con std :: shared_ptr
- 2. Uso apropiado de shared_ptr?
- 3. shared_ptr en std :: tr1
- 4. std :: shared_ptr y inicializador
- 5. Uso de luabind y std :: shared_ptr con la herencia
- 6. Cómo manejar la evolución de C++ std :: namespace? por ejemplo: std :: tr1 :: shared_ptr vs. std :: shared_ptr vs. boost :: shared_ptr vs. boost :: tr1 :: shared_ptr
- 7. Pasando std :: shared_ptr a Constructores
- 8. impulso serializar y std :: shared_ptr
- 9. ¿Debo verificar boost :: shared_ptr o std :: shared_ptr antes de usarlo?
- 10. hilo de seguridad std :: shared_ptr explicó
- 11. Clang, std :: shared_ptr y std :: menos/operador <
- 12. puntero sin formato C++ y std :: shared_ptr
- 13. Personalizar std :: shared_ptr o boost :: shared_ptr para lanzar una excepción en NULL deferencia
- 14. Sobrecarga e implementación del uso de shared_ptr
- 15. No puedo usar std :: vector de auto_ptr - ¿Debería usar shared_ptr?
- 16. por qué std :: shared_ptr usa operaciones de CPU atómicas
- 17. ¿Debo std :: mover un shared_ptr en un constructor de movimiento?
- 18. Uso de std :: accumulate
- 19. Cómo resolver un conflicto entre boost :: shared_ptr y using std :: shared_ptr?
- 20. Diferencia entre boost :: shared_ptr y std :: shared_ptr del archivo estándar <memory>
- 21. impulso :: ptr_container y std :: vector <shared_ptr>
- 22. Si quiero usar std :: shared_ptr, ¿qué encabezado incluir?
- 23. Fundición shared_ptr <T> a shared_ptr <void>
- 24. El uso de std :: mover
- 25. Uso idiomático de std :: rel_ops
- 26. QList y shared_ptr
- 27. shared_ptr múltiple almacenar mismo puntero
- 28. impulso :: shared_ptr contenedor estándar
- 29. ¿Para qué se utiliza shared_ptr (shared_ptr <Y> const & r, T * p) de boost?
- 30. boost :: shared_ptr and Herencia
No utiliza 'std :: shared_ptr' para una matriz dinámicamente asignada, no llama al apropiado 'delete'. Probablemente quieras 'std :: vector'. –
birryree
@birryree: Técnicamente hablando, podría ir por std :: shared_ptr> si la semántica de propiedad compartida fuera importante para usted. O el conjunto compartido de Boost. Vea esta pregunta, por ejemplo: http://stackoverflow.com/questions/6796655/why-use-one-vs-the-other-boostshared-array-vs-boostshared-ptrstdvecto –
@StuartGolodetz - buen punto sobre la semántica de propiedad. piyush314 debería saber que 'shared_array' es una construcción Boost (no estándar), y si realmente quisiera una matriz asignada sin formato, podría usar un argumento' std :: default_delete 'para la eliminación del puntero, como este: 'std :: shared_ptr name (new double [size], std :: default_delete ());'. –
birryree