इस विषय के बारे में पहले से ही कुछ प्रश्न हैं, लेकिन मुझे अभी भी यकीन नहीं है कि क्या करना है: हमारे कोडबेस कई स्थानों पर shared_ptr
का उपयोग करता है। मुझे यह मानना है कि हमने इसे लिखते समय स्वामित्व को स्पष्ट रूप से परिभाषित नहीं किया है।क्या मुझे विधि में पास होने पर shared_ptr को weak_ptr में परिवर्तित करना चाहिए?
हम पहले (अप्रत्यक्ष) परिपत्र निर्भरता मैं अपने डिजाइन में गलतियों को सही करना चाहते हैं की खोज की होने के बाद
void doSomething(shared_ptr<MyClass> ptr)
{
//doSomething() is a member function of a class, but usually won't store the ptr
ptr->foo();
...
}
की तरह कुछ तरीकों की है। लेकिन मुझे बिल्कुल यकीन नहीं है कि कैसे। विधि से
void doSomething(weak_ptr<MyClass> ptr)
{
shared_ptr<MyClass> ptrShared = ptr.lock();
ptrShared->foo();
...
}
से विधि को बदलने में कोई लाभ है?
मैं भी उलझन में हूं क्योंकि कुछ लोग कहते हैं (Google स्टाइल गाइड समेत) कि पहले स्थान पर स्वामित्व सही होना महत्वपूर्ण है (जो शायद weak_ptrs
का परिचय होगा, उदाहरण के लिए ऊपर दिए गए तरीकों के साथ उदाहरण में, लेकिन हमारे पास कई सदस्य चर के लिए भी है)। अन्य कहते हैं (नीचे दिए गए लिंक देखें) कि आपको चक्रीय निर्भरताओं को तोड़ने के लिए weak_ptr का उपयोग करना चाहिए। हालांकि, उन्हें पहचानना हमेशा आसान नहीं होता है, इसलिए मुझे आश्चर्य है कि अगर मुझे समस्याओं में भाग लेने तक उन्हें वास्तव में shared_ptr का उपयोग करना चाहिए (और उन्हें एहसास है), और फिर उन्हें ठीक करें ??
आपके विचारों के लिए धन्यवाद!
भी
- shared_ptr and weak_ptr differences
- boost::shared_ptr cycle break with weak_ptr
- boost, shared ptr Vs weak ptr? Which to use when?
क्या साझा किया जाएगा और पीआरआर बेहतर होगा? –
DanDan
"उनका पता लगाना हमेशा आसान नहीं होता है" - फिर वास्तव में आपको अपनी डिजाइन प्रक्रिया में और कदम जोड़ने की आवश्यकता है। आपके वर्ग संबंध आरेखों पर प्रकाश और अंधेरे रेखाएं, या जो कुछ भी लेता है। इसके अलावा आप कमजोर पॉइंटर्स के बजाय कच्चे पॉइंटर्स के साथ चक्र तोड़ने पर विचार कर सकते हैं, अधिकांश विषम संबंधों के लिए जहां "मालिक" सभी "गैर-मालिकों" से पहले कभी नष्ट नहीं होगा। –
@DanDan: मुझे ऐसा नहीं लगता है, http://stackoverflow.com/questions/327573/c-passing-references-to-boostshared-ptr – Philipp