2011-09-14 13 views
14

boost::mutex::scoped_lock एक म्यूटेक्स लॉक करने के आसपास एक आसान आरएआईआई रैपर है। मैं किसी और चीज के लिए एक समान तकनीक का उपयोग करता हूं: एक आरएआईआई रैपर एक सीरियल डिवाइस से अलग/पुनः संलग्न करने के लिए डेटा इंटरफेस पूछने के आसपास।scoped_lock कैसे "अप्रयुक्त चर" चेतावनी उत्सर्जित करने से बचता है?

क्या मैं समझ नहीं है, हालांकि, यही वजह है कि केवल मेरे वस्तु नीचे कोड mst — जिसका इन्स्टेन्शियशन और विनाश दुष्प्रभाव — कारणों g++ एक "अप्रयुक्त चर" जबकि l का प्रबंधन करता है त्रुटि चेतावनी फेंकना की क्या ज़रूरत है में शांत रहना।

क्या आप जानते हैं? क्या तुम मुझे बता सकते हो?

[[email protected] ~]$ cat test.cpp 
#include <boost/shared_ptr.hpp> 
#include <boost/thread/mutex.hpp> 
#include <iostream> 

struct MyScopedThing; 
struct MyWorkerObject { 
    void a() { std::cout << "a"; } 
    void b() { std::cout << "b"; } 

    boost::shared_ptr<MyScopedThing> getScopedThing(); 
}; 

struct MyScopedThing { 
    MyScopedThing(MyWorkerObject& w) : w(w) { 
     w.a(); 
    } 
    ~MyScopedThing() { 
     w.b(); 
    } 

    MyWorkerObject& w; 
}; 

boost::shared_ptr<MyScopedThing> MyWorkerObject::getScopedThing() { 
    return boost::shared_ptr<MyScopedThing>(new MyScopedThing(*this)); 
} 

int main() { 
    boost::mutex m; 
    boost::mutex::scoped_lock l(m); 

    MyWorkerObject w; 
    const boost::shared_ptr<MyScopedThing>& mst = w.getScopedThing(); 
} 


[[email protected] ~]$ g++ test.cpp -o test -lboost_thread -Wall 
test.cpp: In function ‘int main()’: 
test.cpp:33: warning: unused variable ‘mst’ 

[[email protected] ~]$ ./test 
ab[[email protected] ~]$ g++ -v 2>&1 | grep version 
gcc version 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC) 
+2

यह के साथ "क्या आप जानते हैं? क्या आप मुझे बता सकते हैं?" एक सवाल समाप्त करने के लिए एक छोटे से बेमानी है। : पी – wilhelmtell

+2

@ विल्हेल्मटेल: उनमें से केवल एक अनावश्यक है; दोनों _stylish_ कर रहे हैं;) –

+0

@Tomalak बस एक असंबंधित बात: मैं चर नामित 'वास्तविक कोड में l' :) –

उत्तर

6

ध्यान दें कि प्रश्न के बाद से अन्य उत्तर लिखा गया था बदल गया है।

संभावना कारण जी ++ मौजूदा रूप में चेतावनी दी है नहीं करता है क्योंकि mst एक संदर्भ है, और निर्माण और एक संदर्भ destructing कोई साइड इफेक्ट नहीं है। यह सच है कि यहां संदर्भ एक अस्थायी जीवनकाल को बढ़ा रहा है, जिसका इसके निर्माता और विनाशक में प्रभाव पड़ता है, लेकिन स्पष्ट रूप से g ++ को यह नहीं पता कि इससे कोई फर्क पड़ता है।

+0

हाँ, ऐसा लगता है। :(यह एक शर्म की बात है कि यहां कुछ और ठोस नहीं है (ऐसा नहीं है कि मैं इस व्यवहार को दस्तावेज करने की उम्मीद कर सकता हूं), लेकिन मैं आपके उत्तर से सहमत हूं। –

+1

+1, सबसे अधिक संभावना स्पष्टीकरण। यह ध्यान देने योग्य है कि स्थिर विश्लेषण है कंपाइलर्स में कमजोर और यही कारण है कि ऐसी चेतावनी उत्पन्न होती है। – sharptooth

+2

+1: जब संकलक कॉन्स्ट्रेंस को अस्थायी बाध्यकारी प्रक्रिया करता है तो यह एक अज्ञात स्थानीय चर इंजेक्ट करता है और उसके बाद संदर्भ के साथ बाध्य करता है। जब तक यह स्थिर विश्लेषण करने के लिए मिलता है यह संभवतः 'टाइप __internal; टाइप कॉन्स और आर = __internal;' जैसा कोड देखता है और संदर्भ * अप्रयुक्त * –

0

मुझे लगता है कारण अपनी कक्षा एक छोटी सी नाशक होता है, और कहा कि जी ++ केवल अप्रयुक्त चर अगर नाशक मामूली बात है के बारे में चेतावनी दी है। एक गैर-तुच्छ विनाशक का आह्वान करना "उपयोग" है।

+0

क्षमा करें, प्रश्न संपादित करें। जब लोग ऐसा करते हैं तो मुझे नफरत है, लेकिन ऐसा कुछ था जिसे मैंने नहीं माना था। जैसा कि आप अब देख सकते हैं, यह एकमात्र कारक नहीं है। –

+0

@Tomalak: तो आपने क्यू संपादित किया और मूल प्रश्न का उत्तर देने के लिए पोस्ट किया गया एक उत्तर नीचे दिया? या यह कुछ ट्रोल है? –

+0

@ एएलएस: क्या अब आपके पास जादू है "देखें कि कौन से वोटों को रोकता है" क्षमता? यदि हां, तो यह आपको झूठ बोल रहा है ...मैंने डाउनवोट नहीं किया, लेकिन जो भी संभवतः ऐसा करता था क्योंकि उत्तर सवाल का जवाब नहीं देता है। हां, मुझे पता है कि यही कारण है कि मैंने सवाल बदल दिया है, लेकिन जेम्स अब अपने उत्तर को हटाने के लिए स्वतंत्र है और फिर सबकुछ बराबर है। :) –

1

यदि मेरी याददाश्त सही तरीके से मेरी सेवा करती है, तो g ++ में ऑप्टिमाइज़ेशन सेटिंग्स के आधार पर अलग-अलग unused variable त्रुटियों को उत्सर्जित करने की दुर्भाग्यपूर्ण आदत है क्योंकि पता लगाने के लिए ऑप्टिमाइज़र स्तर पर पता चलता है।

यही है, कोड एसएसए फॉर्म में अनुकूलित किया गया है, और यदि अनुकूलक यह मानता है कि एक चर, अनुकूलन के बाद, अप्रयुक्त है, तो यह एक चेतावनी उत्सर्जित कर सकता है (मैं इसके लिए क्लैंग विश्लेषण पसंद करता हूं ...)।

इसलिए शायद यह पता लगाने की बात है कि विनाशक क्या करता है। मुझे आश्चर्य है कि जब भी विनाशक की परिभाषा ऑफ़लाइन है, तो यह एक रूढ़िवादी दृष्टिकोण लेता है, मैं अनुमान लगाता हूं कि यह एक फ़ंक्शन कॉल के बराबर होगा और this चर के उपयोग के रूप में योग्य होगा।

संबंधित मुद्दे