unique_ptr smart shared_ptr make_unique c++11 vector runtime-error smart-pointers unique-ptr

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.