La eliminación manual es útil en algunos (¿muy?) Raros casos.
¡Además de eliminar explícitamente, a veces TIENE que destruir explícitamente un puntero compartido cuando lo "borra"!
Las cosas pueden ponerse raras cuando interactúan con el código C, pasando un shared_ptr como un valor opaco.
Por ejemplo I tiene la siguiente para el paso de objetos desde y hacia el lenguaje de script Lua que está escrito en C. (www.lua.org)
static void push(lua_State *L, std::shared_ptr<T> sp)
{
if(sp == nullptr) {
lua_pushnil(L);
return;
}
// This is basically malloc from C++ point of view.
void *ud = lua_newuserdata(L, sizeof(std::shared_ptr<T>));
// Copy constructor, bumps ref count.
new(ud) std::shared_ptr<T>(sp);
luaL_setmetatable(L, B::class_name);
}
así que eso es un shared_ptr en parte de la memoria malloc'd . El reverso es este ... (la configuración se llamará justo antes de que la basura de Lua recolecte un objeto y 'lo libere').
static int destroy(lua_State *L)
{
// Grab opaque pointer
void* ud = luaL_checkudata(L, 1, B::class_name);
std::shared_ptr<T> *sp = static_cast<std::shared_ptr<T>*>(ud);
// Explicitly called, as this was 'placement new'd
// Decrements the ref count
sp->~shared_ptr();
return 0;
}
Ciertamente se le permite eliminar una (asignada dinámicamente) * shared_ptr *; borrar su contenido es una pregunta completamente diferente ;-) –
Creo que está buscando 'weak_ptr'. – ybungalobill
La asignación dinámica de un 'shared_ptr' anula el propósito de utilizar' shared_ptr'. – Dan