नए क्यूटी 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 वस्तु ही अभी भी जीवित है और:
यहाँ एक उदाहरण है अब मेरे लिए कोई उपयोग नहीं है। क्या मुझे कुछ याद आती है?
क्या होता है जब आप टाइमर को नष्ट:
मैं पैच की एक जोड़ी है कि इस व्यवहार ठीक करना चाहिए धक्का दे दिया? –
क्या वह भी सोचा था, लेकिन संदर्भ गिनती अभी भी 2 =/ – Sigil
रहती है, अगर मैं उस कनेक्शन * * कनेक्शन.data() = 'भाग में कनेक्शन चर संग्रहीत नहीं करता और टाइमर को हटाता हूं तो यह एकमात्र तरीका है। जो अभी भी बहुत अजीब है। – Sigil