यहाँ इसने कई shared_ptr "परिवार" बनाने कुछ उदाहरण कोड (ऑनलाइन here) है:अप्रत्याशित व्यवहार जब एक ही वस्तु
#include <memory>
struct Foo : public std::enable_shared_from_this<Foo> {};
void example()
{
auto sharedFoo = std::make_shared<Foo>();
std::shared_ptr<Foo> nonDeletingSharedFoo(sharedFoo.get(), [](void*){});
nonDeletingSharedFoo.reset();
sharedFoo->shared_from_this(); // throws std::bad_weak_ptr
}
क्या मैं (कई compilers के तहत) को देखने के यह है कि जब nonDeletingSharedFoo
रीसेट, है weak_ptr
आंतरिक रूप से enable_shared_from_this
द्वारा उपयोग किया जाता है, इसलिए shared_from_this
पर आने वाली कॉल विफल हो जाती है।
मैं nonDeletingSharedFoo
उम्मीद sharedFoo
से एक पूरी तरह से अलग रेफरी गिनती के लिए के बाद से यह एक कच्चे सूचक से निर्माण किया गया था, लेकिन स्पष्ट रूप से यह अभी भी Foo
वस्तु के आंतरिक weak_ptr
के कमजोर गिनती प्रभावित कर रहा है। मुझे लगता है कि ऐसा इसलिए है क्योंकि shared_ptr
कन्स्ट्रक्टर और/या विनाशक कुछ खास करते हैं जब इंगित करने के लिए प्रकार enable_shared_from_this
लागू करता है।
तो क्या यह कोड मानक का उल्लंघन करता है? क्या कोई समाधान है, या क्या लागू करने वाले ऑब्जेक्ट पर एकाधिक shared_ptr
"परिवार" होना संभव नहीं है?
मुझे इस नोट को cppreference [प्रलेखन] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this) में 'enable_shared_from_this' के लिए मिला:" किसी ऑब्जेक्ट के लिए std :: shared_ptr का निर्माण करना पहले से ही किसी अन्य std :: shared_ptr द्वारा प्रबंधित किया गया आंतरिक रूप से संग्रहीत कमजोर संदर्भ से परामर्श नहीं करेगा और इस प्रकार अपरिभाषित व्यवहार का कारण बन जाएगा। " हालांकि, मुझे इसे वापस करने के लिए मानक में कुछ भी नहीं मिला, इसलिए मैं अब भी सोच रहा हूं कि यह वास्तव में अमान्य कोड है या सिर्फ एक ऐसा मामला है जो हर किसी को 'enable_shared_from_this' लागू करने के तरीके के कारण विफल रहता है। – dlf