কীভাবে একটি "দ্বিগুণ মুক্ত বা দুর্নীতি" ত্রুটিটি চিহ্নিত করা যায়


92

আমি যখন আমার (সি ++) প্রোগ্রামটি চালাচ্ছি তখন এটি ত্রুটিযুক্ত হয়ে ক্রাশ হয়।

* গ্লিবিসি সনাক্ত হয়েছে * ./লোড: ডাবল ফ্রি বা দুর্নীতি (! পূর্ব): 0x0000000000006650 ***

আমি কীভাবে ত্রুটিটি সনাক্ত করতে পারি?

আমি std::coutসাফল্য ছাড়াই, মুদ্রণ ( ) বিবৃতি ব্যবহার করার চেষ্টা করেছি । এটাকে gdbআরও সহজ করতে পারব?


4
আমি অবাক হয়েছি কেন সকলেই NULLপয়েন্টারগুলিতে পরামর্শ দেয় (কোনটি ত্রুটিগুলি মাস্ক করে যা অন্যথায় ধরা পড়ে, যেমন এই প্রশ্নটি দুর্দান্তভাবে দেখায়), তবে কেউ কেবল ম্যানুয়াল মেমরি পরিচালনা না করার পরামর্শ দেয় না, যা সি ++ তে খুব সম্ভব। আমি deleteবছরের পর বছর লিখিনি । (এবং, হ্যাঁ, আমার কোডটি পারফরম্যান্স-সমালোচনামূলক Otherwise অন্যথায় এটি সি ++ তে লেখা হত না))
এসবিআই

4
@ এসবিআই: গাদা দুর্নীতি এবং এর মতো ঘটনা খুব কমই ধরা পড়ে, কমপক্ষে কোথায় ঘটেছিল তা নয় not NULLআইএন পয়েন্টারগুলি আপনার প্রোগ্রামটিকে আগে ক্রাশ করতে পারে।
হাস্তুরকুন

@ হাস্তুরকুন: আমি দৃ strongly়ভাবে একমত নই। NULLপয়েন্টারদের একটি প্রধান উত্সাহ হ'ল একটি delete ptr;সেকেন্ডটি বয়ে যাওয়া থেকে রোধ করা - যা একটি ত্রুটিটি মাস্ক করছে, কারণ সেই দ্বিতীয়টি deleteকখনই ঘটেনি। (এটি কোনও পয়েন্টারটি এখনও কোনও বৈধ অবজেক্টের দিকে ইঙ্গিত করছে কিনা তা যাচাই করার জন্য এটি ব্যবহার করা হয় just তবে এটি কেবল আপনার প্রশ্নে উত্থাপন করে কেন আপনার সুযোগে একটি পয়েন্টার রয়েছে যার দিকে নির্দেশ করার কোনও অবকাশ নেই doesn't)
এসবিআই

উত্তর:


64

আপনি যদি গ্লিবিসি ব্যবহার করে থাকেন তবে আপনি MALLOC_CHECK_পরিবেশের পরিবর্তনশীলটিকে সেট করতে পারেন 2, এটি গ্লাবসিটির একটি ত্রুটি সহনীয় সংস্করণ ব্যবহার mallocকরবে, যার ফলে ডাবল ফ্রি হওয়ার পরে আপনার প্রোগ্রামটি বাতিল করতে হবে।

set environment MALLOC_CHECK_ 2আপনার প্রোগ্রামটি চালানোর আগে কমান্ডটি ব্যবহার করে আপনি gdb থেকে সেট করতে পারেন ; free()কলটি ব্যাকট্রেসে দৃশ্যমান সহ প্রোগ্রামটি বাতিল করা উচিত ।

দেখতে জন্য man পৃষ্ঠাmalloc() আরও তথ্যের জন্য


4
সেট MALLOC_CHECK_2আসলে স্থির আমার ডবল বিনামূল্যে সমস্যা (যদিও এটি যদি এটি ডিবাগ মোড শুধুমাত্র এর ফিক্সিং নয়)
PUK

4
@ পুক আমার কাছে একই সমস্যা রয়েছে, MALLOC_CHECK_ 2 এ সেট করা আমার ডাবল-ফ্রি সমস্যা এড়াতে পারে না। ইস্যু পুনরুত্পাদন এবং ব্যাকট্র্যাস সরবরাহ করার জন্য কোডের চেয়ে কম ইনজেক্ট করার জন্য এখানে আর কী বিকল্প রয়েছে?
ওয়েই ঝং

MALLOC_CHECK_- এ সেট করার ফলে সমস্যাটি এড়ানো যায় have সহকর্মী / কেউ ... সমস্যাটি প্রদর্শনের জন্য আপনি কি অন্যরকম উপায় বের করেছেন?
pellucidcoder

"যখন MALLOC_CHECK_ একটি শূন্য-মানকে সেট করা থাকে, তখন একটি বিশেষ (কম দক্ষ) বাস্তবায়ন ব্যবহৃত হয় যা সাধারণ ত্রুটির বিরুদ্ধে সহনশীল হওয়ার জন্য ডিজাইন করা হয়েছিল, যেমন একই যুক্তি দিয়ে ফ্রি ডাবল কল, বা একক বাইট (ছাড়িয়ে দেওয়া) - ওয়ান বাগের মাধ্যমে) " gnu.org/software/libc/manual/html_node/… সুতরাং মনে হচ্ছে MALLOC_CHECK_ কেবল সাধারণ স্মৃতি ত্রুটিগুলি এড়ানোর জন্য ব্যবহৃত হয়, এটি সনাক্ত না করে।
পেলুসিডকোডার

প্রকৃতপক্ষে .... সমর্থন.microfocus.com/kb/doc.php?id=3113982 মনে হচ্ছে MALLOC_CHECK_ থেকে 3 সেট করা সবচেয়ে দরকারী এবং ত্রুটিগুলি সনাক্ত করতে ব্যবহৃত হতে পারে।
pellucidcoder

32

কমপক্ষে দুটি সম্ভাব্য পরিস্থিতি রয়েছে:

  1. আপনি একই সত্তা দু'বার মুছে ফেলছেন
  2. আপনি এমন কিছু মুছছেন যা বরাদ্দ ছিল না

প্রথমটির জন্য আমি দৃ deleted়ভাবে সমস্ত মুছে ফেলা পয়েন্টারগুলিকে NULL-ing প্রস্তাব দিচ্ছি।

আপনার কাছে তিনটি বিকল্প রয়েছে:

  1. ওভারলোড নতুন এবং বরাদ্দগুলি মুছুন এবং ট্র্যাক করুন
  2. হ্যাঁ, জিডিবি ব্যবহার করুন - তারপরে আপনি আপনার ক্র্যাশ থেকে একটি ব্যাকট্র্যাস পাবেন এবং এটি সম্ভবত খুব সহায়ক হবে
  3. প্রস্তাবিত হিসাবে - ভালগ্র্যান্ড ব্যবহার করুন - এটি প্রবেশ করা সহজ নয় তবে ভবিষ্যতে এটি আপনার হাজার হাজার গুণ সাশ্রয় করবে ...

২. দুর্নীতির কারণ ঘটবে, তবে আমি মনে করি না যে এই বার্তাটি সাধারণত উপস্থিত হবে, যেহেতু স্যানিটি পরীক্ষা করা কেবলমাত্র স্তূপে করা হয়। তবে আমি মনে করি he. হিপ বাফার ওভারফ্লো সম্ভব।
ম্যাথু ফ্ল্যাশেন

ভাল একটা. সত্য আমি পয়েন্টারটি নুল করতে মিস করলাম এবং এই ত্রুটির মুখোমুখি হয়েছি। পাঠ শিখেছি!
হুশি

26

আপনি জিডিবি ব্যবহার করতে পারেন তবে আমি প্রথমে ভালগ্রাইন্ডটি চেষ্টা করব । দেখুন দ্রুত সূচনা নির্দেশিকা

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


4
@ এসএমআর, এক্ষেত্রে উত্তরের প্রয়োজনীয় অংশগুলি পুরো, বড়, লিঙ্কযুক্ত পৃষ্ঠা। সুতরাং উত্তরের লিঙ্কটি সহ পুরোপুরি ঠিক আছে fine লেখক কেন জিডিবির চেয়ে ভালগ্রাইন্ডকে অগ্রাধিকার দেয় এবং নির্দিষ্ট সমস্যাটি কীভাবে মোকাবেলা করবে সে সম্পর্কে কয়েকটি শব্দ IMHO উত্তরটি থেকে আসলে কী অনুপস্থিত।
nddou

20

তিনটি মূল নিয়ম:

  1. NULLবিনামূল্যে পরে পয়েন্টার সেট করুন
  2. NULLমুক্ত করার আগে পরীক্ষা করুন ।
  3. শুরুতে পয়েন্টার NULLশুরু করুন।

এই তিনটির সংমিশ্রণটি বেশ ভালভাবে কাজ করে।


4
আমি সি বিশেষজ্ঞ নই, তবে আমি সাধারণত আমার মাথাটি পানির উপরে রাখতে পারি। # 1 কেন? আপনি যখন নিখরচায় পয়েন্টার ব্যবহার করার চেষ্টা করছেন এবং কেবল একটি নীরব ত্রুটি নয় তখন কি আপনার প্রোগ্রামটি ক্র্যাশ হয়ে যায়?
ড্যানিয়েল ক্ষয়ক্ষতি

4
@ প্রিভিশন: হ্যাঁ, এটাই মূল বিষয়। এটি একটি ভাল অনুশীলন: মোছা মেমরির পয়েন্টার থাকা ঝুঁকিপূর্ণ।

10
কঠোরভাবে বলতে চাই আমি মনে করি যে # 2 অপ্রয়োজনীয় কারণ বেশিরভাগ সংকলকরা কোনও সমস্যা তৈরি না করেই আপনাকে নাল পয়েন্টার মোছার চেষ্টা করতে দেয়। আমি নিশ্চিত যে আমি ভুল হলে কেউ আমাকে সংশোধন করবে। :)
10

11
@ কম্পোনেন্ট 10 আমি মনে করি যে কিছুই করার জন্য সি স্ট্যান্ডার্ড দ্বারা NULL মুক্ত করা প্রয়োজন।
ডেমি

4
@ ডিমেট্রি: হ্যাঁ, আপনি ঠিক বলেছেন "মুছার অপারেন্ডের মান যদি নাল পয়েন্টার হয় তবে অপারেশনের কোনও প্রভাব নেই।" (আইএসও / আইইসি 14882: 2003 (ই) 5.3.5.2)
10

15

আপনি valgrindএটি ডিবাগ করতে ব্যবহার করতে পারেন ।

#include<stdio.h>
#include<stdlib.h>

int main()
{
 char *x = malloc(100);
 free(x);
 free(x);
 return 0;
}

[sand@PS-CNTOS-64-S11 testbox]$ vim t1.c
[sand@PS-CNTOS-64-S11 testbox]$ cc -g t1.c -o t1
[sand@PS-CNTOS-64-S11 testbox]$ ./t1
*** glibc detected *** ./t1: double free or corruption (top): 0x00000000058f7010 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3a3127245f]
/lib64/libc.so.6(cfree+0x4b)[0x3a312728bb]
./t1[0x400500]
/lib64/libc.so.6(__libc_start_main+0xf4)[0x3a3121d994]
./t1[0x400429]
======= Memory map: ========
00400000-00401000 r-xp 00000000 68:02 30246184                           /home/sand/testbox/t1
00600000-00601000 rw-p 00000000 68:02 30246184                           /home/sand/testbox/t1
058f7000-05918000 rw-p 058f7000 00:00 0                                  [heap]
3a30e00000-3a30e1c000 r-xp 00000000 68:03 5308733                        /lib64/ld-2.5.so
3a3101b000-3a3101c000 r--p 0001b000 68:03 5308733                        /lib64/ld-2.5.so
3a3101c000-3a3101d000 rw-p 0001c000 68:03 5308733                        /lib64/ld-2.5.so
3a31200000-3a3134e000 r-xp 00000000 68:03 5310248                        /lib64/libc-2.5.so
3a3134e000-3a3154e000 ---p 0014e000 68:03 5310248                        /lib64/libc-2.5.so
3a3154e000-3a31552000 r--p 0014e000 68:03 5310248                        /lib64/libc-2.5.so
3a31552000-3a31553000 rw-p 00152000 68:03 5310248                        /lib64/libc-2.5.so
3a31553000-3a31558000 rw-p 3a31553000 00:00 0
3a41c00000-3a41c0d000 r-xp 00000000 68:03 5310264                        /lib64/libgcc_s-4.1.2-20080825.so.1
3a41c0d000-3a41e0d000 ---p 0000d000 68:03 5310264                        /lib64/libgcc_s-4.1.2-20080825.so.1
3a41e0d000-3a41e0e000 rw-p 0000d000 68:03 5310264                        /lib64/libgcc_s-4.1.2-20080825.so.1
2b1912300000-2b1912302000 rw-p 2b1912300000 00:00 0
2b191231c000-2b191231d000 rw-p 2b191231c000 00:00 0
7ffffe214000-7ffffe229000 rw-p 7ffffffe9000 00:00 0                      [stack]
7ffffe2b0000-7ffffe2b4000 r-xp 7ffffe2b0000 00:00 0                      [vdso]
ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0                  [vsyscall]
Aborted
[sand@PS-CNTOS-64-S11 testbox]$


[sand@PS-CNTOS-64-S11 testbox]$ vim t1.c
[sand@PS-CNTOS-64-S11 testbox]$ cc -g t1.c -o t1
[sand@PS-CNTOS-64-S11 testbox]$ valgrind --tool=memcheck ./t1
==20859== Memcheck, a memory error detector
==20859== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==20859== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==20859== Command: ./t1
==20859==
==20859== Invalid free() / delete / delete[]
==20859==    at 0x4A05A31: free (vg_replace_malloc.c:325)
==20859==    by 0x4004FF: main (t1.c:8)
==20859==  Address 0x4c26040 is 0 bytes inside a block of size 100 free'd
==20859==    at 0x4A05A31: free (vg_replace_malloc.c:325)
==20859==    by 0x4004F6: main (t1.c:7)
==20859==
==20859==
==20859== HEAP SUMMARY:
==20859==     in use at exit: 0 bytes in 0 blocks
==20859==   total heap usage: 1 allocs, 2 frees, 100 bytes allocated
==20859==
==20859== All heap blocks were freed -- no leaks are possible
==20859==
==20859== For counts of detected and suppressed errors, rerun with: -v
==20859== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)
[sand@PS-CNTOS-64-S11 testbox]$


[sand@PS-CNTOS-64-S11 testbox]$ valgrind --tool=memcheck --leak-check=full ./t1
==20899== Memcheck, a memory error detector
==20899== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==20899== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==20899== Command: ./t1
==20899==
==20899== Invalid free() / delete / delete[]
==20899==    at 0x4A05A31: free (vg_replace_malloc.c:325)
==20899==    by 0x4004FF: main (t1.c:8)
==20899==  Address 0x4c26040 is 0 bytes inside a block of size 100 free'd
==20899==    at 0x4A05A31: free (vg_replace_malloc.c:325)
==20899==    by 0x4004F6: main (t1.c:7)
==20899==
==20899==
==20899== HEAP SUMMARY:
==20899==     in use at exit: 0 bytes in 0 blocks
==20899==   total heap usage: 1 allocs, 2 frees, 100 bytes allocated
==20899==
==20899== All heap blocks were freed -- no leaks are possible
==20899==
==20899== For counts of detected and suppressed errors, rerun with: -v
==20899== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)
[sand@PS-CNTOS-64-S11 testbox]$

একটি সম্ভাব্য সমাধান:

#include<stdio.h>
#include<stdlib.h>

int main()
{
 char *x = malloc(100);
 free(x);
 x=NULL;
 free(x);
 return 0;
}

[sand@PS-CNTOS-64-S11 testbox]$ vim t1.c
[sand@PS-CNTOS-64-S11 testbox]$ cc -g t1.c -o t1
[sand@PS-CNTOS-64-S11 testbox]$ ./t1
[sand@PS-CNTOS-64-S11 testbox]$

[sand@PS-CNTOS-64-S11 testbox]$ valgrind --tool=memcheck --leak-check=full ./t1
==20958== Memcheck, a memory error detector
==20958== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==20958== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==20958== Command: ./t1
==20958==
==20958==
==20958== HEAP SUMMARY:
==20958==     in use at exit: 0 bytes in 0 blocks
==20958==   total heap usage: 1 allocs, 1 frees, 100 bytes allocated
==20958==
==20958== All heap blocks were freed -- no leaks are possible
==20958==
==20958== For counts of detected and suppressed errors, rerun with: -v
==20958== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
[sand@PS-CNTOS-64-S11 testbox]$

ভালগ্রাইন্ড লিঙ্কটি ব্যবহার করে ব্লগটি দেখুন


আমার প্রোগ্রামটি চালাতে প্রায় 30 মিনিট সময় নেয়, ভালগ্রাইন্ডে এটি শেষ হতে 18 থেকে 20 ঘন্টা সময় নিতে পারে।
কেমিন ঝো

11

আধুনিক সি ++ সংকলকগুলির সাহায্যে আপনি স্যানিটাইজারগুলি ট্র্যাক করতে ব্যবহার করতে পারেন ।

উদাহরণ উদাহরণ:

আমার প্রোগ্রাম:

$cat d_free.cxx 
#include<iostream>

using namespace std;

int main()

{
   int * i = new int();
   delete i;
   //i = NULL;
   delete i;
}

ঠিকানা স্যানিটাইজারগুলির সাথে সংকলন করুন:

# g++-7.1 d_free.cxx -Wall -Werror -fsanitize=address -g

এক্সিকিউট :

# ./a.out 
=================================================================
==4836==ERROR: AddressSanitizer: attempting double-free on 0x602000000010 in thread T0:
    #0 0x7f35b2d7b3c8 in operator delete(void*, unsigned long) /media/sf_shared/gcc-7.1.0/libsanitizer/asan/asan_new_delete.cc:140
    #1 0x400b2c in main /media/sf_shared/jkr/cpp/d_free/d_free.cxx:11
    #2 0x7f35b2050c04 in __libc_start_main (/lib64/libc.so.6+0x21c04)
    #3 0x400a08  (/media/sf_shared/jkr/cpp/d_free/a.out+0x400a08)

0x602000000010 is located 0 bytes inside of 4-byte region [0x602000000010,0x602000000014)
freed by thread T0 here:
    #0 0x7f35b2d7b3c8 in operator delete(void*, unsigned long) /media/sf_shared/gcc-7.1.0/libsanitizer/asan/asan_new_delete.cc:140
    #1 0x400b1b in main /media/sf_shared/jkr/cpp/d_free/d_free.cxx:9
    #2 0x7f35b2050c04 in __libc_start_main (/lib64/libc.so.6+0x21c04)

previously allocated by thread T0 here:
    #0 0x7f35b2d7a040 in operator new(unsigned long) /media/sf_shared/gcc-7.1.0/libsanitizer/asan/asan_new_delete.cc:80
    #1 0x400ac9 in main /media/sf_shared/jkr/cpp/d_free/d_free.cxx:8
    #2 0x7f35b2050c04 in __libc_start_main (/lib64/libc.so.6+0x21c04)

SUMMARY: AddressSanitizer: double-free /media/sf_shared/gcc-7.1.0/libsanitizer/asan/asan_new_delete.cc:140 in operator delete(void*, unsigned long)
==4836==ABORTING

স্যানিটাইজারগুলির সম্পর্কে আরও জানতে আপনি এটি বা এটি বা যে কোনও আধুনিক সি ++ সংকলক (যেমন জিসিসি, কলং ইত্যাদি) ডকুমেন্টেশনগুলি পরীক্ষা করতে পারেন ।


5

আপনি কি বুস্টের মতো স্মার্ট পয়েন্টার ব্যবহার করছেন shared_ptr? যদি তাই হয়, আপনি কল করে সরাসরি যে কোনও জায়গায় কাঁচা পয়েন্টার ব্যবহার করছেন কিনা তা পরীক্ষা করে দেখুন get()। আমি এটি বেশ সাধারণ সমস্যা বলে মনে করেছি।

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

অবশ্যই, এটি এখানে আপনার সমস্যা নাও হতে পারে। এটি এখানে সবচেয়ে সহজ একটি উদাহরণ যা এটি কীভাবে ঘটতে পারে তা দেখায়। প্রথম মুছুন ঠিক আছে তবে সংকলকটি অনুভূত করে যে এটি ইতিমধ্যে সেই মেমরিটি মুছে ফেলেছে এবং একটি সমস্যা তৈরি করে। এই কারণেই মুছে ফেলার সাথে সাথে 0 নির্দেশকের কাছে নির্ধারিত করা ভাল ধারণা।

int main(int argc, char* argv[])
{
    char* ptr = new char[20];

    delete[] ptr;
    ptr = 0;  // Comment me out and watch me crash and burn.
    delete[] ptr;
}

সম্পাদনা: পরিবর্তিত deleteহয়েছে delete[], কারণ পিটিআরটি একটি চরের অ্যারে is


আমি আমার প্রোগ্রামে কোনও মুছুন আদেশগুলি ব্যবহার করি নি। এটি কি এখনও সমস্যা হতে পারে?
নিউরোমান্সার

4
@ ফেনম: আপনি ডিলিট ব্যবহার করেন নি কেন? আপনি স্মার্ট পয়েন্টার ব্যবহার করছেন কারণ এটি কি? সম্ভবত আপনি স্তূপে অবজেক্ট তৈরি করতে আপনার কোডে নতুন ব্যবহার করছেন? যদি উভয়ের উত্তর হ্যাঁ হয় তবে আপনি কি কাঁচা পয়েন্টারগুলির চারপাশে অনুলিপি করতে স্মার্ট পয়েন্টারগুলিতে get / সেট ব্যবহার করছেন? যদি তাই হয়, না! আপনি রেফারেন্স গণনা ভঙ্গ করবেন। বিকল্পভাবে আপনি লাইব্রেরি কোড থেকে একটি পয়েন্টার বরাদ্দ করতে পারেন যা আপনি স্মার্ট পয়েন্টারে কল করছেন। আপনি যদি মেমরিটির নির্দেশিত 'নিজস্ব' না হন তবে এটি করবেন না, কারণ গ্রন্থাগার এবং স্মার্ট পয়েন্টার উভয়ই এটি মোছার চেষ্টা করবে।
উপাদান 10

-2

আমি জানি এটি একটি খুব পুরানো থ্রেড, তবে এটি এই ত্রুটির জন্য শীর্ষস্থানীয় গুগল অনুসন্ধান এবং কোনও প্রতিক্রিয়া ত্রুটির একটি সাধারণ কারণ উল্লেখ করে না।

যা ইতিমধ্যে বন্ধ করে দেওয়া কোনও ফাইলটি বন্ধ করে দিচ্ছে।

আপনি যদি মনোযোগ দিচ্ছেন না এবং দুটি আলাদা ফাংশন একই ফাইলটি বন্ধ করে রাখেন তবে দ্বিতীয়টি এই ত্রুটিটি উত্পন্ন করবে।


আপনি ভুল, ত্রুটিটি ঠিক যেমনটি বলেছেন ঠিক তেমনি এই ত্রুটিটি ডাবল ফ্রি হওয়ার কারণে নিক্ষিপ্ত হয়। আপনি দুবার কোনও ফাইল বন্ধ করে দিচ্ছেন এই বিষয়টি স্পষ্টতই ঘনিষ্ঠ পদ্ধতিটি একই ডেটা দুবার মুক্ত করার চেষ্টা করছে বলে দ্বিগুণ ফ্রি ঘটায়।
জেফ্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.