त्रुटि: मुक्त (): अमान्य अगला आकार (तेज़):


90

यह अजीब त्रुटि मुझे क्या हो रही है? मैं उबटन 10.10 पर g ++ का उपयोग करके C ++ संकलित कर रहा हूं। यह बेतरतीब ढंग से पॉप अप करता है जब मैं निष्पादन योग्य (शायद 8 घंटे में 2 बार, 10 संकलन एक घंटे के साथ) चलाता हूं। हालांकि, अगर मैं साफ और फिर से तैयार करता हूं तो यह ज्यादातर समय चला जाता है।

*** glibc detected *** ./emailQueue.app: free(): invalid next size (fast): 0x0000000001c40270 ***
======= Backtrace: =========
/lib/libc.so.6(+0x774b6)[0x7f490d95e4b6]
/lib/libc.so.6(cfree+0x73)[0x7f490d964c83]
./emailQueue.app[0x401f47]
/lib/libc.so.6(__libc_start_main+0xfe)[0x7f490d905d8e]
./emailQueue.app[0x401cc9]
======= Memory map: ========
00400000-0040d000 r-xp 00000000 08:01 1311132                            /home/server/Projects/email/emailQueue.app
0060d000-0060e000 r--p 0000d000 08:01 1311132                            /home/server/Projects/email/emailQueue.app
0060e000-0060f000 rw-p 0000e000 08:01 1311132                            /home/server/Projects/email/emailQueue.app
01c40000-01c82000 rw-p 00000000 00:00 0                                  [heap]
7f4908000000-7f4908021000 rw-p 00000000 00:00 0 
7f4908021000-7f490c000000 ---p 00000000 00:00 0 
7f490ce52000-7f490ce5e000 r-xp 00000000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490ce5e000-7f490d05d000 ---p 0000c000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490d05d000-7f490d05e000 r--p 0000b000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490d05e000-7f490d05f000 rw-p 0000c000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490d05f000-7f490d075000 r-xp 00000000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d075000-7f490d275000 ---p 00016000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d275000-7f490d276000 r--p 00016000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d276000-7f490d277000 rw-p 00017000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d277000-7f490d28e000 r-xp 00000000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d28e000-7f490d48d000 ---p 00017000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d48d000-7f490d48e000 r--p 00016000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d48e000-7f490d48f000 rw-p 00017000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d48f000-7f490d491000 rw-p 00000000 00:00 0 
7f490d491000-7f490d49a000 r-xp 00000000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d49a000-7f490d69a000 ---p 00009000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d69a000-7f490d69b000 r--p 00009000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d69b000-7f490d69c000 rw-p 0000a000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d69c000-7f490d6ca000 rw-p 00000000 00:00 0 
7f490d6ca000-7f490d6e2000 r-xp 00000000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d6e2000-7f490d8e1000 ---p 00018000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d8e1000-7f490d8e2000 r--p 00017000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d8e2000-7f490d8e3000 rw-p 00018000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d8e3000-7f490d8e7000 rw-p 00000000 00:00 0 
7f490d8e7000-7f490da61000 r-xp 00000000 08:01 1048743                    /lib/libc-2.12.1.so
7f490da61000-7f490dc60000 ---p 0017a000 08:01 1048743                    /lib/libc-2.12.1.so
7f490dc60000-7f490dc64000 r--p 00179000 08:01 1048743                    /lib/libc-2.12.1.so
7f490dc64000-7f490dc65000 rw-p 0017d000 08:01 1048743                    /lib/libc-2.12.1.so
7f490dc65000-7f490dc6a000 rw-p 00000000 00:00 0 
7f490dc6a000-7f490dc7f000 r-xp 00000000 08:01 1048655                    /lib/libgcc_s.so.1
7f490dc7f000-7f490de7e000 ---p 00015000 08:01 1048655                    /lib/libgcc_s.so.1
7f490de7e000-7f490de7f000 r--p 00014000 08:01 1048655                    /lib/libgcc_s.so.1
7f490de7f000-7f490de80000 rw-p 00015000 08:01 1048655                    /lib/libgcc_s.so.1
7f490de80000-7f490df02000 r-xp 00000000 08:01 1051246                    /lib/libm-2.12.1.so
7f490df02000-7f490e101000 ---p 00082000 08:01 1051246                    /lib/libm-2.12.1.so
7f490e101000-7f490e102000 r--p 00081000 08:01 1051246                    /lib/libm-2.12.1.so
7f490e102000-7f490e103000 rw-p 00082000 08:01 1051246                    /lib/libm-2.12.1.so
7f490e103000-7f490e1eb000 r-xp 00000000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e1eb000-7f490e3ea000 ---p 000e8000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e3ea000-7f490e3f2000 r--p 000e7000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e3f2000-7f490e3f4000 rw-p 000ef000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e3f4000-7f490e409000 rw-p 00000000 00:00 0 
7f490e409000-7f490e5c7000 r-xp 00000000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e5c7000-7f490e7c7000 ---p 001be000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e7c7000-7f490e7cc000 r--p 001be000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e7cc000-7f490e816000 rw-p 001c3000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e816000-7f490e817000 rw-p 00000000 00:00 0 
7f490e817000-7f490e837000 r-xp 00000000 08:01 1048597                    /lib/ld-2.12.1.so
7f490ea15000-7f490ea1c000 rw-p 00000000 00:00 0 
7f490ea33000-7f490ea37000 rw-p 00000000 00:00 0 
7f490ea37000-7f490ea38000 r--p 00020000 08:01 1048597                    /lib/ld-2.12.1.so
7f490ea38000-7f490ea39000 rw-p 00021000 08:01 1048597                    /lib/ld-2.12.1.so
7f490ea39000-7f490ea3a000 rw-p 00000000 00:00 0 
7fffb85b9000-7fffb85da000 rw-p 00000000 00:00 0                          [stack]
7fffb85ff000-7fffb8600000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted

1
एक लापता अर्धविराम ने मेरे लिए यह त्रुटि पैदा की।
एट्ज़ोल

जवाबों:


105

इसका मतलब है कि आपके पास मेमोरी एरर है। आप freeएक ऐसे पॉइंटर की कोशिश कर रहे होंगे जो malloc(या deleteकोई ऐसी वस्तु जो आवंटित नहीं किया गया था) द्वारा आवंटित किया गया था newया आप free/ के लिए कोशिश कर रहे होंगेdelete एक से अधिक बार इस तरह के ऑब्जेक्ट ऐसी । आप एक बफर को ओवरफ्लो कर सकते हैं या अन्यथा मेमोरी को लिख सकते हैं, जिसे आपको नहीं लिखना चाहिए, जिससे ढेर भ्रष्टाचार हो सकता है।

प्रोग्रामिंग त्रुटियों की कोई भी संख्या इस समस्या का कारण बन सकती है। आपको डिबगर का उपयोग करने, बैकट्रेस प्राप्त करने और यह देखने की आवश्यकता है कि त्रुटि होने पर आपका कार्यक्रम क्या कर रहा है। यदि वह विफल हो जाता है और आप यह निर्धारित करते हैं कि आपने पिछले कुछ समय में हीप को दूषित कर दिया है, तो आप कुछ दर्दनाक डिबगिंग के लिए हो सकते हैं (यह बहुत दर्दनाक नहीं हो सकता है यदि प्रोजेक्ट इतना छोटा है कि आप इसे टुकड़े टुकड़े कर सकते हैं)।


37
इस प्रकार की त्रुटियों का स्रोत खोजने पर वेलग्रिंड जैसे उपकरण बहुत सहायक होते हैं। बस सुनिश्चित करें कि आप डिबगिंग प्रतीकों के साथ संकलन करें।
डैनियल गैलाघर

3
FYI करें: मैंने ऐसा तब किया है जब मैंने एक std :: वेक्टर <> का आकार बदला और यह काफी बड़ा नहीं था।
एडम

1
वास्तव में? आपको निशुल्क () के साथ एक मुद्दा मिला जब वेक्टर काफी बड़ा नहीं था। कम से कम पहले प्रश्न पढ़ने का ध्यान रखें।
ज्ञान

21

मुझे एक ही समस्या का सामना करना पड़ा, भले ही मैंने अपने कार्यक्रम में कोई गतिशील मेमोरी आवंटन नहीं किया था, लेकिन मैं इसके लिए मेमोरी आवंटित किए बिना एक वेक्टर के सूचकांक तक पहुंच रहा था। तो, अगर एक ही मामला है, बेहतर कुछ स्मृति का उपयोग आवंटित resize()और फिर वेक्टर तत्वों का उपयोग।


7

हमें कोड की आवश्यकता है, लेकिन यह आमतौर पर तब होता है जब आप free()एक ऐसे पॉइंटर से मेमोरी की कोशिश करते हैं जो आवंटित नहीं होता है। ऐसा अक्सर तब होता है जब आप डबल-फ्री होते हैं।


6

यदि आप व्यूअर की एक सरणी के लिए जगह आवंटित करने की कोशिश कर रहे हैं, जैसे कि

char** my_array_of_strings;  // or some array of pointers such as int** or even void**

तब आपको एन आकार के लिए स्थान आवंटित करते समय शब्द आकार (64-बिट सिस्टम में 8 बाइट, 32-बिट सिस्टम में 4 बाइट) पर विचार करना होगा। एक पॉइंटर का आकार आपके शब्द आकार के समान होता है।

इसलिए जब आप n पॉइंटर्स के लिए स्थान आवंटित करना चाहते हैं, तो आपको वास्तव में क्रमशः 8 या 4 (64-बिट या 32-बिट सिस्टम के लिए) की आवश्यकता होगी।

8 बाइट्स के तत्वों के लिए अपनी आवंटित मेमोरी को ओवरफ्लो करने से बचने के लिए:

my_array_of_strings = (char**) malloc( n * 8 );  // for 64-bit systems
my_array_of_strings = (char**) malloc( n * 4 );  // for 32-bit systems

यदि आप 32-बिट सिस्टम का उपयोग कर रहे हैं, तो प्रत्येक 8 बाइट्स (या 4 बाइट्स) वाले n पॉइंटर्स का एक ब्लॉक वापस आ जाएगा

मैंने देखा है कि जब आप शब्द आकार के लिए मुआवजा नहीं देते हैं, तो लिनक्स आपको सभी एन पॉइंटर्स का उपयोग करने की अनुमति देगा, लेकिन जब आप उस मेमोरी को मुक्त करने का प्रयास करते हैं, तो उसे अपनी गलती का एहसास होता है और यह उस त्रुटि को छोड़ देता है। और यह एक बुरा है, जब आप आवंटित मेमोरी को ओवरफ्लो करते हैं, तो कई सुरक्षा मुद्दे प्रतीक्षा में रहते हैं।


2
हम हार्डकोड 4 या 8 बाइट्स का उपयोग करके किसी भी सिस्टम के समान कोड को सामान्य बना सकते हैं sizeof(char*)
बेन जी

मॉलॉक का उपयोग करते समय sizeofऑपरेटर का उपयोग नहीं करना वास्तव में केवल परेशानी के लिए पूछ रहा है। IIRC मानक एक चार के आकार की गारंटी देता है, लेकिन बहुत कुछ और आईएसए पर निर्भर है, इसलिए आप sizeofहर जगह का उपयोग कर रहे हैं ।
अंजस

1

मुझे ऐसी स्थिति का सामना करना पड़ा जहां कोड एसटीएल की एपी को दरकिनार कर रहा था और किसी ने इसका आकार बदलने पर सरणी को अनिश्चित रूप से लिख दिया। यहाँ जोड़ने के लिए इसे पकड़ा:

void Logo::add(const QVector3D &v, const QVector3D &n)
{
 GLfloat *p = m_data.data() + m_count;
 *p++ = v.x();
 *p++ = v.y();
 *p++ = v.z();
 *p++ = n.x();
 *p++ = n.y();
 *p++ = n.z();
 m_count += 6;
 Q_ASSERT( m_count <= m_data.size() );
}

1

मुझे एक समान त्रुटि का सामना करना पड़ा। यह जल्दबाज़ी में की गई एक ग़लती थी। [1] आकार की घोषणा के बिना पूर्णांक सरणी [] फिर इसे एक्सेस करने की कोशिश कर रहा है। C ++ कंपाइलर को इस तरह की त्रुटि को आसानी से पकड़ना चाहिए यदि यह मुख्य में था। हालाँकि जब से इस विशेष इंट सरणी को एक वस्तु के अंदर घोषित किया गया था, इसे उसी समय बनाया जा रहा था जब मेरी वस्तु (कई ऑब्जेक्ट्स बनाए जा रहे थे) और कंपाइलर एक मुफ्त (): अमान्य अगले आकार (सामान्य) त्रुटि को फेंक रहा था। मैंने इसके लिए 2 स्पष्टीकरणों के बारे में सोचा (कृपया मुझे बताएं कि यदि कोई और अधिक जानता है): 1.) इसका परिणाम कुछ यादृच्छिक स्मृति को सौंपा गया था, लेकिन चूंकि यह सुलभ नहीं था इसलिए यह अन्य सभी ढेर स्मृति को मुक्त करने के लिए बस खोजने की कोशिश कर रहा था यह इंट। 2.) इसके लिए आवश्यक मेमोरी एक प्रोग्राम के लिए व्यावहारिक रूप से अनंत थी और इसे असाइन करने के लिए यह अन्य सभी मेमोरी को खाली कर रहा था।

एक सरल:

    int* a;
    class foo{ 
    foo(){
       for(i=0;i<n;i++)
           a=new int[i];
     }

समस्या का हल किया। लेकिन इसे डिबग करने में बहुत समय लग गया क्योंकि कंपाइलर "वास्तव में" त्रुटि नहीं ढूंढ सका।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.