2012-03-26 16 views
5

¿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

+1

No utiliza 'std :: shared_ptr' para una matriz dinámicamente asignada, no llama al apropiado 'delete'. Probablemente quieras 'std :: vector '. – birryree

+1

@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 –

+2

@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

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 array (new double [256], [] (double * d) {delete [] d;}); '. –

Cuestiones relacionadas