मैं नमूना कोड आप दे दिया है के साथ किसी भी समस्या नहीं दिख रहा।
निम्नलिखित मेरे लिए ठीक काम करता है।
[email protected] ~ $ cat leak_check.cpp && g++ leak_check.cpp && valgrind --leak-check=full ./a.out
#include <cstdlib>
class Base {
public:
static void * operator new (size_t size) {
if (size == 0) size = 1;
return malloc (size);
}
static void operator delete (void *ptr, size_t size) {
if (ptr == NULL) return;
free (ptr);
}
};
int main()
{
Base * p = (Base *) Base::operator new(sizeof(Base));
Base::operator delete((void*)p,sizeof(Base));
}
==4561== Memcheck, a memory error detector
==4561== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==4561== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==4561== Command: ./a.out
==4561==
==4561==
==4561== HEAP SUMMARY:
==4561== in use at exit: 0 bytes in 0 blocks
==4561== total heap usage: 1 allocs, 1 frees, 1 bytes allocated
==4561==
==4561== All heap blocks were freed -- no leaks are possible
==4561==
==4561== For counts of detected and suppressed errors, rerun with: -v
==4561== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 6)
बीटीडब्ल्यू एक शून्य सूचक को मुक्त करना बिल्कुल ठीक है।
free
समारोह अंतरिक्ष के लिए द्वारा ptr
पुनः आवंटित की जाती किए जाने की ओर इशारा किया, कि है, आगे आवंटन के लिए उपलब्ध कराया कारण बनता है। यदि ptr
एक शून्य सूचक है, कोई कार्रवाई होती है।
तो if (ptr == NULL) return;
छोड़ा जा सकता है।
स्रोत
2010-11-27 07:18:38
आप दो बार एक वस्तु हटा सकते हैं या एक सूचक के माध्यम से एक वस्तु 'new' बुला से प्राप्त नहीं हटाने का प्रयास कर रहे हैं? –
एक साइड नोट के रूप में, 'मुफ़्त (एनयूएलएल) 'सुरक्षित होने की गारंटी है (एक नो-ऑप), इसलिए आपको विशेष मामले की आवश्यकता नहीं है। –
एचएम ... मेरा बुरा: यदि आप 'if (size = 0 0)' 'if (size = 0) 'के साथ' if (size == 0)' को प्रतिस्थापित करते हैं और एक निजी डेटा सदस्य के साथ-साथ एक कन्स्ट्रक्टर भी जोड़ते हैं, तो कोड विफल हो जाएगा। मुझे पता है कि 'आकार = 0' एक बग है जो नहीं होना चाहिए, लेकिन जब आप कन्स्ट्रक्टर में इस वर्ग के निजी डेटा सदस्य को प्रारंभ करते हैं तो कोड केवल तभी विफल होता है। – Jaywalker