std::map<int,int> bar;
int foo(int key)
{
bar.erase(key);
return 1;
}
int main()
{
bar[0] = foo(0);
return 0;
}
जब बिजली की बाड़ के साथ स्मृति के उपयोग की जाँच जीसीसी 4.8 SEGS गलती के साथ संकलित इस कोड।C++ एसटीएल नक्शा :: ऑपरेटर [] एक प्रवेश पर किया हटाया जा रहा
LD_PRELOAD=libefence.so.0.0 ./a.out
समस्या तथ्य यह है कि संकलक, एक कोड मानचित्र में एक नई प्रविष्टि आवंटित करने के लिए शुरू होता है कि उत्पन्न करता है तो foo()
कार्यान्वित bar[0]
में लाना मूल्य प्राप्त करने से आता है। foo()
चलाते समय, प्रविष्टि नष्ट हो जाती है और कोड अंततः गैर-आवंटित स्मृति में लिखकर समाप्त होता है।
क्या ऑपरेशन के आदेश के तरीके को संकलक कार्यान्वयन पर निर्भर करता है, या यह सी ++ वर्तमान मानक द्वारा निर्दिष्ट है?
कि ऐसा मत करो .. –
भी http://stackoverflow.com/a/4183735 देखें। –
अनुक्रमण और अनुक्रम बिंदुओं में देखें। यह अनिर्धारित है कि 'bar [0]' का मूल्यांकन 'foo (0)' से पहले किया जाएगा, यदि यह है (और ऐसा लगता है कि यह आपके लिए है) तो आप बड़ी परेशानी में हैं। – AndyG