2012-12-12 14 views
19

नए क्यूटी 5 सिग्नल और स्लॉट सिंटैक्स हमें न केवल स्लॉट्स के सिग्नल कनेक्ट करने की अनुमति देता है, बल्कि सादे पुराने कार्यों और मज़दूरों/लैम्ब्डा को भी जोड़ता है। अब समस्या यह है कि लैम्बडा() ऑपरेटर के साथ अनिवार्य वस्तुएं हैं, और जब आप उन्हें सिग्नल कनेक्ट करते हैं, तो उन्हें क्यूटी आंतरिक कक्षाओं में कहीं भी कॉपी किया जाता है। और, जब आप उस मज़ेदार से संकेत को डिस्कनेक्ट करते हैं, तो यह क्यूटी आंतरिक में रहता है। मैं समझने में असफल रहा, क्या यह एक सामान्य व्यवहार है? या शायद डिस्कनेक्शन के बाद उन कार्यात्मक वस्तुओं को नष्ट करने का एक तरीका है? अच्छी तरह से, यह हालांकिक्यूटी 5 नए सिग्नल लैम्ब्डा कनेक्शन मेमोरी लीक

//example 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QTimer* timer = new QTimer(); 

    QSharedPointer<QMetaObject::Connection> connection(new QMetaObject::Connection()); 

    //functor is created and gets copied inside qt internals, connection variable is captured 
    //inside the functor 

    *connection.data() = QObject::connect(timer, &QTimer::timeout, [=] 
    { 
     qDebug() << "disconnected"; 
     QObject::disconnect(*connection.data()); 
    }); 

    timer->start(10000); 

    return a.exec(); 
} 

//example 
अब

जब मैं स्लॉट वियोग के बाद कनेक्शन चर के मजबूत संदर्भ गिनती को देखो, यह 2 रहता है, जिसका अर्थ है कि functor वस्तु ही अभी भी जीवित है और:

यहाँ एक उदाहरण है अब मेरे लिए कोई उपयोग नहीं है। क्या मुझे कुछ याद आती है?

+0

क्या होता है जब आप टाइमर को नष्ट:

मैं पैच की एक जोड़ी है कि इस व्यवहार ठीक करना चाहिए धक्का दे दिया? –

+0

क्या वह भी सोचा था, लेकिन संदर्भ गिनती अभी भी 2 =/ – Sigil

+0

रहती है, अगर मैं उस कनेक्शन * * कनेक्शन.data() = 'भाग में कनेक्शन चर संग्रहीत नहीं करता और टाइमर को हटाता हूं तो यह एकमात्र तरीका है। जो अभी भी बहुत अजीब है। – Sigil

उत्तर

7

उदाहरण अधिक इंजीनियर है (क्यों QSharedPointer का उपयोग कर रहे हैं? को मानकर कैप्चर क्यों करें?)। लेकिन वास्तव में क्यूटी मज़ेदार वस्तु को लीक कर रही है।

बिंदु यह है कि आंतरिक कनेक्शन सूची को गंदे के रूप में चिह्नित किया जाता है, और जब तक प्रेषक हटा दिया जाता है या कोई नया सिग्नल कनेक्ट नहीं होता है तब तक साफ़ नहीं किया जाता है (cleanConnectionLists के उपयोग देखें)। https://codereview.qt-project.org/#change,42976 और 42979

+1

वैसे हाँ, मुझे पता है कि यह थोड़ा अधिक इंजीनियर हो सकता है, लेकिन मुझे यह आवश्यक है कि साझा पॉइंटर बस संदर्भों की संख्या की आसानी से निगरानी कर सके, यह देखने के लिए कि क्या फ़ैक्टर ऑब्जेक्ट अभी भी जिंदा है, और मेरे पास असली परियोजना जहां समान तर्क मुख्य समारोह के अंदर नहीं है, इसलिए मैं वहां संदर्भ द्वारा कनेक्शन को कैप्चर नहीं कर सकता। – Sigil