2011-10-10 22 views
5

क्या यह बढ़ावा देने के लिए सदस्य कार्य को पास करने के लिए std :: bind का उपयोग करना सुरक्षित है :: सिग्नल 2 :: सिग्नल :: कनेक्ट()? दूसरे शब्दों में, बूस्ट :: बाइंड और std :: बाइंड अदला-बदली है?क्या यह boost :: signals2 के साथ std :: bind का उपयोग सुरक्षित है?

यह वीसी ++ 2010 एसपी 1 के साथ संकलित करता है, लेकिन टेम्पलेट कोड मेरे सिर पर है और मुझे डर है कि मैं अपरिभाषित व्यवहार क्षेत्र में आगे बढ़ रहा हूं।

उत्तर

1

connect समारोह एक boost::function वस्तु है, जो मूल रूप से कुछ भी एक operator() इसके लिए परिभाषित किया है कि चारों ओर एक सामान्य आवरण है लेता है। इसलिए यह बिल्कुल सुरक्षित है जितना आप बाध्यकारी हैं।

उदाहरण के लिए, इस यथोचित सुरक्षित है:

boost::shared_ptr<ClassName> pValue = boost::make_shared<ClassName>(...); 
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...); 

यह यथोचित सुरक्षित है, क्योंकि यह अपने डेटा के हिस्से के रूप में एक boost::shared_ptr संग्रहीत करता है।

ClassName *pValue = new ClassName(...); 
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...); 

यह सशर्त सुरक्षित है। यदि यह कनेक्शन अभी भी मौजूद है और यह delete pValue निष्पादित करता है तो यह तुरंत असुरक्षित हो जाता है।

व्यक्तिगत रूप से, मैं "सशर्त रूप से सुरक्षित" में अधिक विश्वास नहीं डालता, लेकिन यह आपके ऊपर है। मुद्दा यह है कि boost::bind पर जो कुछ भी आप बाध्य करते हैं, वह तब तक अस्तित्व में रहना चाहिए जब तक यह बाध्य न हो।

2

मुझे इस विषय में अनुभव नहीं हुआ है कि मैं connect की अपेक्षा करता हूं जो वैध फ़ंक्शन कॉल ऑपरेटर लागू करता है। इसे किसी भी फ़ंक्शन या फ़ंक्शन ऑब्जेक्ट के साथ कॉल करना सुरक्षित होना चाहिए जो हस्ताक्षर से मेल खाता हो, इसे बढ़ावा दें :: बाइंड, std :: बाइंड या कुछ और। बूस्ट लाइब्रेरी जेनेरिक होने के लिए डिज़ाइन किए गए हैं, इसलिए वे आमतौर पर एक-दूसरे के कार्यान्वयन के विवरण नहीं लेते हैं।