मैं हाल ही में प्रबंधित पॉइंटर्स सीख रहा हूं और निम्नलिखित परिदृश्य में भाग गया हूं।सी ++ स्टैक ऑब्जेक्ट के साझा_ptr
मैं गेम व्यू के लिए मॉडल/नियंत्रक वर्ग को कार्यान्वित कर रहा हूं। मेरा विचार, मॉडल में चीजें प्रस्तुत करेगा। बहुत सीधा। मेरा मुख्य समारोह में, मैं सभी तीन इस तरह का दृष्टांत:
RenderModel m;
m.AddItem(rect); // rect gets added just fine, it's an "entity" derivee
RenderView v;
v.SetModel(m);
मेरे विचार वर्ग प्रस्तुत करना बिल्कुल स्पष्ट है:
class RenderView
{
public:
explicit RenderView();
~RenderView();
void Update();
void SetModel(RenderModel& model);
private:
// disable
RenderView(const RenderView& other);
RenderView& operator=(const RenderView& other);
// private members
boost::scoped_ptr<RenderModel> _model;
};
setview के लिए कार्यान्वयन सुंदर मानक है:
void RenderView::SetModel(RenderModel& model)
{
_model.reset(&model);
}
इसकी कुंजी यह है कि दृश्य एक स्मार्ट सूचक में एक मॉडल स्टोर करता है। हालांकि मुख्य रूप से, मॉडल को ढेर पर आवंटित किया गया था। जब प्रोग्राम निकलता है, तो स्मृति दो बार हटा दी जाती है। यह समझ में आता है। मेरी वर्तमान समझ मुझे बताती है कि जो कुछ भी smart_ptr (किसी भी तरह का) में संग्रहीत हो जाता है उसे ढेर पर आवंटित नहीं किया जाना चाहिए था।
उपर्युक्त सेटअप के बाद, मेरा प्रश्न सरल है: मैं कैसे निर्देश दे सकता हूं कि ढेर पर पैरामीटर आवंटित नहीं किया गया था? एक पैरामीटर के रूप में एकमात्र समाधान के रूप में एक स्मार्ट सूचक स्वीकार कर रहा है? फिर भी मुझे लगता है कि किसी को यह सुनिश्चित नहीं कर सकता है मेरे विचार वर्ग का उपयोग कर के रूप में कुछ गलत नहीं कर सका:
// If I implemented SetModel this way:
void RenderView::SetModel(const std::shared_ptr<RenderModel>& model)
{
_model.reset(&*model);
}
RenderModel m;
RenderView v;
std::shared_ptr<RenderModel> ptr(&m); // create a shared_ptr from a stack-object.
v.SetModel(ptr);
यदि कॉलर share_ptr को गलत तरीके से नियंत्रित करता है, तो मुझे लगता है कि ऐसा कुछ पता लगाने का कोई तरीका नहीं है? मैं बस पूछता हूं, क्योंकि मुझे लगता है कि मैं फिर से यह गलती कर सकता हूं, और मैं इस मुद्दे को फिर से डिबग करने में कुछ घंटे नहीं बिताना चाहता हूं। मैं अपने मॉनिटर पर अपने चिपकने वाला नोट चिपक सकता हूं जब तक कि यह मेरे सिर में जला नहीं जाता ... – Short
पता लगाने के लिए कुछ ज्ञात 'चाल' हैं कि कोई वस्तु ढेर या ढेर में रहती है, जैसे पते की तुलना करना। इन सभी रिले अपरिभाषित या कार्यान्वयन निर्भर व्यवहार पर। मुझे लगता है कि अगर यह सिर्फ खुद को संकेत दे तो यह काम कर सकता है, लेकिन वे असली समाधान नहीं हैं। –
नहीं, यदि आपका फ़ंक्शन 'std :: shared_ptr' लेता है, तो यह बताने का कोई तरीका नहीं है कि वह सूचक एक मान्य ऑब्जेक्ट को इंगित करता है या नहीं। उस ने कहा, अगर यह स्पष्ट रूप से 'std :: shared_ptr' लेता है, तो स्क्रू अप करना बहुत कठिन होता है (कोड जो स्थानीय चर से 'std :: shared_ptr' बनाता है, पहली नजर में गलत दिखता है और इससे बचना आसान होता है)। –