निम्नलिखित कोड कोसाइडर करें:सी ++ पॉइंटर्स का ऐरे: हटाएं या हटाएं []?
class Foo
{
Monster* monsters[6];
Foo()
{
for (int i = 0; i < 6; i++)
{
monsters[i] = new Monster();
}
}
virtual ~Foo();
}
सही विनाशक क्या है?
यह:
Foo::~Foo()
{
delete [] monsters;
}
या यह:
Foo::~Foo()
{
for (int i = 0; i < 6; i++)
{
delete monsters[i];
}
}
वर्तमान में मेरे पास सबसे ऊपर का कन्स्ट्रक्टर है और सबकुछ ओकी काम कर रहा है, लेकिन निश्चित रूप से मैं नहीं देख सकता कि यह लीक होने वाला होता है ...
व्यक्तिगत रूप से, मुझे लगता है कि दूसरा संस्करण जो कुछ भी कर रहा हूं, उसके बारे में अधिक तर्कसंगत है। वैसे भी, ऐसा करने के लिए "उचित" तरीका क्या है?
क्या आप कृपया थोड़ा सा समझा सकते हैं कि किसी को कॉपी कन्स्ट्रक्टर और कॉपी-असाइनमेंट ऑपरेटर को क्यों अक्षम करना चाहिए? – gen
@gen यह एक अनुमान है, इसलिए इसे इसके लायक होने के लिए लें, लेकिन मैं * सोच रहा हूं कि कस्टम कॉपी असाइनमेंट/कन्स्ट्रक्टर के बिना निम्नलिखित हो सकता है: 2 पॉइंटर्स की एक राक्षस सरणी के साथ फू ऑब्जेक्ट्स जो इंगित करता है * वही * राक्षसों। यदि आप Foo2 में Foo1 को पॉइंटर्स को नष्ट कर देते हैं तो वे अमान्य हो जाएंगे क्योंकि वे जिस स्मृति को इंगित करते हैं उसे Foo1 द्वारा मुक्त किया गया है। – ZeroStatic