कुछ हद तक दुर्लभ मामलों में स्पष्ट रूप से हटाना आसान है।
स्पष्ट रूप से हटाने के अलावा, कभी-कभी आपको एक साझा सूचक को स्पष्ट रूप से नष्ट करना होता है जब आप इसे 'हटा रहे हैं'!
सी कोड के साथ इंटरफेसिंग करते समय चीजें अजीब हो सकती हैं, एक साझा मूल्य के रूप में एक shared_ptr को गुजरती हैं।
उदाहरण मैं करने के लिए और लुआ पटकथा भाषा जो सी में लिखा है (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);
}
तो कुछ malloc'd स्मृति में एक shared_ptr thats । इसके विपरीत यह है ... (लूआ कचरा एक वस्तु एकत्र करता है और 'मुक्त है) से पहले ही इसे बुलाया जा सकता है।
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;
}
स्रोत
2017-05-24 00:53:19
निश्चित रूप से आपको एक (गतिशील रूप से आवंटित) * shared_ptr * को हटाने की अनुमति है; इसकी सामग्री को हटाना एक पूरी तरह से अलग सवाल है ;-) –
मुझे लगता है कि आप 'weak_ptr' की तलाश में हैं। – ybungalobill
गतिशील रूप से 'shared_ptr' आवंटित करने से 'shared_ptr' का उपयोग करने के उद्देश्य को हराया जाता है। – Dan