c++11 - smart - shared_ptr
por qué std:: unique_ptr vector obtiene una excepción de puntero no válida (2)
En el destructor de std::unique_ptr
llamará a delete
en el puntero &s
que no fue asignado a través de new
.
Solo usa:
std::vector<std::string> vector;
vector.emplace_back("str");
std::cout << pv[0] << std::endl;
No hay necesidad de std::unique_ptr<std::string>
allí.
Escribí un código simple para ayudarme a entender los indicadores inteligentes:
string s = "str";
vector <unique_ptr<string>> pv ;
pv.push_back(unique_ptr<string>(&s));
cout<<*(pv[0])<<endl;
Este código compila bien, pero me da un error de tiempo de ejecución:
str * Error en `... '': munmap_chunk (): puntero no válido: 0x00007ffd956e57e0 * Cancelado (núcleo volcado)
¿Qué pasó y qué he hecho mal?
Su cuerda se está destruyendo dos veces, una cuando su pv
queda fuera del alcance y se elimina, liberando todos sus elementos unique_ptr
contenidos, y una vez cuando s
se sale del alcance.
Para utilizar un vector de punteros únicos (o para usar punteros únicos en general), es esencial que no tengan alias. Entonces podrías escribir:
auto *s = new std::string("str");
pv.push_back(std::unique_ptr<std::string>(s));
// do not write "delete s" anywhere...
O, más simple y más seguro:
pv.push_back(std::make_unique<std::string>("str")); // make_unique is C++14
O incluso:
std::unique_ptr<std::string> p{new std::string("str")};
pv.push_back(std::move(p));
// Do not attempt to use p beyond this point.