c++ - Why does this double-free error happen? -
मेरे पास एक आधार और व्युत्पन्न वर्ग है:
में:
// वर्ग A {protected: static std :: string a; // अन्य डमी कोड}; A.cpp में
std :: string A :: a = "bar"; // अन्य डमी कोड में B.h:
#include "a.h" // अन्य शामिल हैं वर्ग B: सार्वजनिक ए {सार्वजनिक: int c; // अन्य डमी कोड}; main.cpp:
#include "a.h" #include "b.h" int main () {printf ("foo"); वापसी 0; } अब मैं "सी" और "बी.एस.यू." के रूप में दो अलग-अलग साझा पुस्तकालयों में ए सीपीपी और बीकपीपी को संकलित करता हूं और फिर उन्हें मेन सीपीपी के विरुद्ध लिंक कर रहा हूं। जब मैं प्रोग्राम चलाता हूं - यह दूषित-डबल-लिंक की गई सूची त्रुटि से निकल जाता है Valgrind के साथ चल रहा है मुझे लगता है कि एक अमान्य मुक्त त्रुटि है। ऐसा क्यों होता है?
मैं समझता हूं कि प्रत्येक .इस फ़ाइल में स्थिर ग्लोबल वैरिएबल की अपनी प्रति होगी, लेकिन तब क्या होता है जब कोई व्युत्पन्न वर्ग एक अलग साझा लाइब्रेरी में होता है जब बेस क्लास अलग होता है साझा लाइब्रेरी और बेस क्लास में स्थिर वैरिएबल हैं? स्मृति के आधार वर्गों में स्थिर चर के लिए स्मृति को किस प्रकार आवंटित किया गया है / नष्ट किया गया है, जहां सभी व्युत्पन्न वर्ग मौजूद हैं?
मैं समझता हूं कि प्रत्येक .so फ़ाइल में स्थिर वैश्विक वैरिएबल की अपनी प्रतिलिपि होनी चाहिए
आप गलत तरीके से समझते हैं, जब तक कि आप एओ को किसी a.so और b.so दोनों में नहीं जोड़ते हैं इसलिए फाइल के पास अपनी स्थिर प्रतिलिपि की कोई प्रति नहीं है: ए ए.ओ. को केवल एक .so और बी.एस.ओ. से जुड़ा होना चाहिए, इसे एक .so के साथ जोड़ा जाना चाहिए, नहीं एओ
Comments
Post a Comment