मैंने एक साधारण परीक्षण केस बनाया है जो मैंने देखा है कि एक बड़े कोड बेस में मैंने देखा है कि एक अजीब व्यवहार का प्रदर्शन किया है। यह टेस्ट केस नीचे है। मैं ऐसे structs के मानचित्र में एक संरचना के लिए सूचक बनाने के लिए एसटीएल मानचित्र के "[]" ऑपरेटर पर भरोसा कर रहा हूं। नीचे दिए गए टेस्ट केस में, लाइन ...एक एसटीएल में structs के मानचित्र, "[]" ऑपरेटर क्यों संरचना के dtor 2 अतिरिक्त बार बुलाया जाता है?
TestStruct *thisTestStruct = &testStructMap["test"];
... मुझे पॉइंटर प्राप्त करता है (और मानचित्र में एक नई प्रविष्टि बनाता है)। मैंने देखा है कि अजीब चीज यह है कि यह लाइन न केवल नक्शा में एक नई प्रविष्टि का कारण बनती है ("[]" ऑपरेटर की वजह से), लेकिन किसी कारण से यह संरचना के विनाशक को दो अतिरिक्त बार कहा जाता है। मुझे कुछ याद आ रहा है - किसी भी मदद की बहुत सराहना की है! धन्यवाद!
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct TestStruct;
int main (int argc, char * const argv[]) {
map<string, TestStruct> testStructMap;
std::cout << "Marker One\n";
//why does this line cause "~TestStruct()" to be invoked twice?
TestStruct *thisTestStruct = &testStructMap["test"];
std::cout << "Marker Two\n";
return 0;
}
struct TestStruct{
TestStruct(){
std::cout << "TestStruct Constructor!\n";
}
~TestStruct(){
std::cout << "TestStruct Destructor!\n";
}
};
कोड ऊपर आउटपुट निम्नलिखित ...
/*
Marker One
TestStruct Constructor! //makes sense
TestStruct Destructor! //<---why?
TestStruct Destructor! //<---god why?
Marker Two
TestStruct Destructor! //makes sense
*/
... लेकिन मुझे समझ नहीं आता क्या TestStruct नाशक के पहले दो आमंत्रण का कारण बनता है? (मुझे लगता है कि पिछले नाशक मंगलाचरण समझ में आता है क्योंकि testStructMap क्षेत्र से बाहर जा रहा है।)
उत्तर नीचे दिया गया है। लेकिन ऑप्टिमाइज़ेशन स्तर जितना अधिक होगा उतना ही देखेंगे और देखें कि कितनी प्रतियां मिलती हैं। –
इस प्रश्न के बारे में और जानकारी और इसके पीछे क्यों इस प्रश्न में पाया जा सकता है: https://stackoverflow.com/questions/26021118/why-doesnt-c-stdmapoperator-use-inplace-new – srm