2011-06-09 10 views
10

मैं wxwidgets सीखने की कोशिश कर रहा हूं, लेकिन मैं उस बिंदु पर फंस गया हूं जिसे मुझे दस्तावेज़ में कहीं भी स्पष्टीकरण नहीं मिल रहा है।WxWidgets फ्रेम्स को रिसाव क्यों नहीं करता है?

#include <wx/wx.h> 

class MyApp : public wxApp 
{ 
    virtual bool OnInit(); 
}; 

IMPLEMENT_APP(MyApp) 

bool MyApp::OnInit() 
{ 
    wxFrame *frame = new wxFrame(NULL, -1, _("Hello World"), wxPoint(50, 50), 
            wxSize(450, 350));  
    frame->Show(true); 
    return true; 
} 

विशेष रूप से, क्यों यह है कि frame लीक नहीं करता है: मैं इस न्यूनतम wxWidgets कार्यक्रम समझने की कोशिश कर रहा हूँ? इसे कब जारी किया जाता है और किसकी ज़िम्मेदारी है? एक सामान्य कार्यक्रम में एक सूचक जो किसी भी चीज़ को पारित नहीं करता है और जो हटाए बिना गुंजाइश से बाहर हो जाता है, लगभग निश्चित रूप से एक रिसाव है, लेकिन स्पष्ट रूप से यह wxwidgets में ऐसा नहीं है।

+1

यह अपने आप ढांचे के साथ रजिस्टर कर सकते हैं, जब विंडो बंद हो हटाए जाने के लिए। –

+0

@Xeo यह कोड सीधे प्रलेखन में उदाहरण कोड से आता है (जोर के लिए कटौती)। मुझे कोई उदाहरण कोड नहीं मिला है जिसमें फ्रेम हटा दिया गया है, इसलिए मुझे लगता है कि यह किसी भी तरह से हटा दिया जाता है। साथ ही मुझे प्रलेखन में कुछ भी नहीं मिल रहा है जो विशेष रूप से कहता है कि फ़्रेम हटा दिया जाएगा, इसलिए मुझे उम्मीद है कि एसओ पर किसी की पूरी कहानी होगी। – Mankarse

+0

औग- मुझे पूरा जवाब मिला [यहां] (http://docs.wxwidgets.org/trunk/overview_windowdeletion.html)। – Mankarse

उत्तर

3

wxWidgets विकि पर नमस्ते विश्व उदाहरण में टिप्पणी देखें:। क्यों फ्रेम चर कहीं भी नष्ट नहीं किया है

http://wiki.wxwidgets.org/Hello_World

"आप सोच रहे होंगे सकता शीर्ष विंडो के रूप में फ्रेम की स्थापना करके आवेदन के लिए, एप्लिकेशन हमारे लिए फ्रेम हटा देगा (अधिक गहराई से स्पष्टीकरण के लिए, मेमोरी लीक से बचें देखें)। "

हालांकि, आपके द्वारा पोस्ट किया गया कोड SetTopWindow() को विकी से कोड के तरीके से कॉल नहीं करता है। तो मुझे लगता है कि यह रिसाव होगा।

+0

मुझे नहीं लगता कि यह वास्तव में सही है। [प्रलेखन] (http://docs.wxwidgets.org/trunk/classwx_app.html#39033ec4c79bc1871c91ada7b31941e6) कहता है कि "आपको शीर्ष विंडो सेट करने की आवश्यकता नहीं है, यह केवल एक सुविधा है"। मुझे अभी [wxTopLevelWindow] (http://docs.wxwidgets.org/trunk/classwx_top_level_window.html) के लिए प्रलेखन मिला है जो बताता है कि "WxTopLevelWindow के उदाहरण आंतरिक शीर्ष स्तर की विंडो सूची में wxwidgets द्वारा प्रबंधित किए जाते हैं"। – Mankarse

+0

ठीक है, ठीक है, यह शीर्ष-स्तरीय-नस्ल है जो इसे रिसाव नहीं बनाता है ... और यदि यह निहित है कि सभी wxFrames शीर्ष-स्तर हैं तो मुझे लगता है कि यह है। क्यूटी उस तरह से काम नहीं करता है, बीटीडब्ल्यू। अगर आप क्यूटी की कोशिश नहीं करते हैं तो मैं चिपकूंगा, यह वास्तुकार (और दस्तावेज) wxwidgets से काफी बेहतर है: http://doc.qt.nokia.com/latest/tutorials-widgets-toplevel.html – HostileFork

+0

मेरे पास है क्यूटी को देखा, लेकिन इसकी [अपवाद सुरक्षा की कमी] (http://developer.qt.nokia.com/doc/qt-4.8/exceptionsafety.html) मुझे किसी भी एप्लिकेशन के लिए अनुपयुक्त मानती है जिसके लिए शुद्धता उच्च प्राथमिकता है । – Mankarse

-1

एक मेमोरी लीक तब होती है जब कोई प्रोग्राम स्मृति आवंटित करता रहता है और इसे कभी जारी नहीं करता है। आखिरकार ऐसा एक कार्यक्रम आवंटित करने और रोकने के लिए नई स्मृति से बाहर हो जाएगा।

MyApp :: OnInit() प्रोग्राम शुरू होने पर एक बार कहा जाता है। फ्रेम के लिए स्मृति एक बार आवंटित की जाती है और कार्यक्रम समाप्त होने तक आवंटित रखा जाता है, जो वास्तव में आपको होने की आवश्यकता होती है। कोई स्मृति रिसाव नहीं है क्योंकि ऑनइनिट() में नया WxFrame केवल एक बार कहा जाता है।

यह अच्छी तरह से हो सकता है कि WxWidgets WxFrame सूचक पंजीकृत करता है और यदि प्रोग्राम गहराई से बंद हो जाता है तो इसे साफ करने के बाद देखता है। यह अच्छा होगा, लेकिन कोई व्यावहारिक अंतर नहीं है।

+1

एक व्यावहारिक अंतर है। सबसे पहले, यदि आप प्रोग्राम को एक उत्कृष्ट गतिशील वस्तु के साथ समाप्त करने देते हैं ... विनाशक कभी नहीं चलता है। यहां तक ​​कि यदि आपके पास एक छोटा विनाशक है, तो भी आपको एक समस्या है कि अगर आप वालग्रिंड या अन्य रिपोर्टिंग टूल का उपयोग कर रहे हैं तो "दुर्घटनाग्रस्त" से इस तरह के "उद्देश्यपूर्ण" स्मृति रिसाव को बताना मुश्किल है। – HostileFork

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