ত্রুটি: বিনামূল্যে (): পরবর্তী আকার অবৈধ (দ্রুত):


91

এই অদ্ভুত ত্রুটিটি আমি কী পাচ্ছি? আমি উবুন্টু ১০.১০ তে জি ++ ব্যবহার করে সি ++ সংকলন করছি। যখন আমি এক্সিকিউটেবলটি চালিত করি তখন এটি এলোমেলোভাবে পপ আপ হয় (এক ঘন্টা 10 টি সংকলন সহ 8 ঘন্টার মধ্যে 2 বার হতে পারে)। তবে, আমি যদি পরিষ্কার এবং পুনরায় কম্পাইল করি তবে এটি বেশিরভাগ সময় চলে যায়।

*** 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

4
অনুপস্থিত অর্ধপরিবাহটি আমার জন্য এই ত্রুটি ঘটায়।
atzol

উত্তর:


108

এর অর্থ আপনার মেমরির ত্রুটি রয়েছে। আপনি এমন freeপয়েন্টারটির চেষ্টা করছেন যা বরাদ্দ হয়নি malloc(বা এমন deleteকোনও বস্তু যা দ্বারা নির্মিত হয়নি new) অথবা আপনি একবার free/ deleteএকবারে এই জাতীয় কোনও বিষয়টির চেষ্টা করছেন । আপনি হয়ত একটি বাফার উপচে পড়ছেন বা অন্যথায় মেমরিটিতে লিখে যাচ্ছেন যা আপনার লেখা উচিত নয়, ফলে প্রচুর দুর্নীতি দেখা দেয়।

যে কোনও সংখ্যক প্রোগ্রামিং ত্রুটি এই সমস্যার কারণ হতে পারে। আপনাকে একটি ডিবাগার ব্যবহার করতে হবে, একটি ব্যাকট্রিজ পেতে হবে এবং ত্রুটি দেখা দিলে আপনার প্রোগ্রামটি কী করছে তা দেখুন। যদি এটি ব্যর্থ হয় এবং আপনি নির্ধারণ করেন যে আপনি সময়ের পূর্বের কোনও সময়ে গাদাটি দূষিত করেছেন, তবে আপনি কিছুটা বেদনাদায়ক ডিবাগিংয়ের জন্য থাকতে পারেন (প্রকল্পটি যদি খুব ছোট হয় তবে আপনি এটি টুকরো টুকরো মোকাবেলা করতে পারেন)।


37
এই ধরণের ত্রুটির উত্স খুঁজতে গিয়ে ভালগ্র্যান্ডের মতো সরঞ্জামগুলি খুব সহায়ক। কেবলমাত্র আপনি ডিবাগিং প্রতীকগুলি সংকলন করে তা নিশ্চিত করুন।
ড্যানিয়েল গ্যালাগার

4
এফওয়াইআই: আমি একটি স্টাডি :: ভেক্টর <> পুনরায় আকার দেওয়ার পরে এটি হয়েছি এবং এটি যথেষ্ট পরিমাণে বড় ছিল না।
আদম 27 এক্স

4
সত্যি? যখন ভেক্টর যথেষ্ট পরিমাণে বড় ছিল না তখন আপনি ফ্রি () দিয়ে একটি সমস্যা পেয়েছিলেন। কমপক্ষে প্রথমে প্রশ্নটি পড়ার যত্ন নিন।
জ্ঞান

22

আমি একই সমস্যাটির মুখোমুখি হয়েছি, যদিও আমি আমার প্রোগ্রামে কোনও গতিশীল মেমরি বরাদ্দ করি নি, তবে এর জন্য মেমরি বরাদ্দ না করে আমি কোনও ভেক্টরের সূচকটি অ্যাক্সেস করছি। সুতরাং, একই ক্ষেত্রে, আরও ভালভাবে কিছু মেমরি ব্যবহার করে বরাদ্দ করুন 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

এটি এন পয়েন্টারগুলির একটি ব্লক ফিরে আসবে, প্রতিটিতে 8 টি বাইট রয়েছে (বা আপনি যদি 32-বিট সিস্টেম ব্যবহার করছেন তবে 4 বাইট)

আমি লক্ষ করেছি যে লিনাক্স আপনাকে সমস্ত এন পয়েন্টার ব্যবহারের অনুমতি দেবে যখন আপনি শব্দের আকারের জন্য ক্ষতিপূরণ না দিয়ে থাকেন, কিন্তু আপনি যখন সেই স্মৃতিটিকে মুক্ত করার চেষ্টা করেন তখন এটি তার ভুলটি উপলব্ধি করে এবং এটি বরং বাজে ত্রুটিটি দেয়। এবং এটি একটি খারাপ বিষয়, যখন আপনি বরাদ্দ মেমরি উপচে পড়ে যান, অনেক সুরক্ষা সমস্যা অপেক্ষা করে থাকে।


4
আমরা 4 বা 8 বাইট ব্যবহার করে হার্ডকডিং না করে যে কোনও সিস্টেমে একই কোডটিকে জেনেরিক করতে পারি sizeof(char*)
বেন জি।

ম্যালোক ব্যবহার করার সময় sizeofঅপারেটরটি ব্যবহার না করা সত্যিই কেবল সমস্যা জিজ্ঞাসা করছে। আইআইআরসি স্ট্যান্ডার্ডটি একটি চরের আকারের গ্যারান্টি দেয়, তবে আরও অনেক কিছু আইএসএর উপর নির্ভর করে, তাই আপনি 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

আমি একই ধরণের ত্রুটির মুখোমুখি হয়েছি। তাড়াহুড়ো করে এটি করা একটি নুব ভুল ছিল। আকারের ইন্টিরিয় [a] না করে পূর্ণসংখ্যা অ্যারে তারপরে অ্যাক্সেস করার চেষ্টা না করে। সি ++ সংকলকটি যদি মূলত থাকে তবে সহজেই এ জাতীয় ত্রুটি ধরা উচিত ছিল। তবে যেহেতু এই নির্দিষ্ট int অ্যারেটি কোনও সামগ্রীর অভ্যন্তরে ঘোষিত হয়েছিল, এটি আমার অবজেক্টের (একই সাথে অনেকগুলি বস্তু তৈরি করা হচ্ছিল) একই সময়ে তৈরি করা হয়েছিল এবং সংকলকটি একটি নিখরচায় (): অবৈধ পরের আকার (স্বাভাবিক) ত্রুটি নিক্ষেপ করছে। আমি এর জন্য ২ টি ব্যাখ্যার কথা ভেবেছিলাম (দয়া করে কেউ আরও জানতে পারলে আমাকে আলোকিত করুন): ১) এর ফলে কিছু এলোমেলো স্মৃতি এতে নির্ধারিত হয়েছিল তবে এটি অ্যাক্সেসযোগ্য না হওয়ায় এটি অন্য সমস্ত হিপ মেমরিটি কেবল সন্ধান করার চেষ্টা করছিল এই int ২) এটির প্রয়োজনীয় মেমরিটি কোনও প্রোগ্রামের জন্য কার্যত অসীম ছিল এবং এটি নির্ধারণের জন্য এটি অন্য সমস্ত স্মৃতি মুক্ত করে দিচ্ছিল।

একটি সহজ:

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

সমস্যার সমাধান. তবে এটি ডিবাগ করার চেষ্টা করতে অনেক সময় লাগল কারণ সংকলক ত্রুটিটি "সত্যই" খুঁজে পেতে পারেনি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.