2013-11-20 76 views
3

我一直在環顧這個錯誤的含義,它似乎意味着我不止一次釋放同一個對象。我似乎無法弄清楚如何防止這種情況。任何幫助或建議將不勝感激。Glibc錯誤:雙重空閒或損壞

File(randname) 
File(a.out) 
~File(a.out) 
~Directory(randname) 
~File(null) 
~File() 
*** glibc detected *** a.out: double free or corruption (fasttop): 0x0804b048 *** 
======= Backtrace: ========= 
/lib/libc.so.6(+0x6ff0b)[0xb74baf0b] 
/usr/local/gcc/gcc-cilk/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb7671b4f] 
/usr/local/gcc/gcc-cilk/lib/libstdc++.so.6(_ZdaPv+0x1b)[0xb7671b9b] 
a.out[0x8048983] 
a.out[0x8048b12] 
a.out[0x80487d7] 
/lib/libc.so.6(__libc_start_main+0xf3)[0xb7464003] 
a.out[0x8048701] 
======= Memory map: ======== 
08048000-08049000 r-xp 00000000 00:25 268562602 /home/user/test/a.out 
08049000-0804a000 r--p 00000000 00:25 268562602 /home/user/test/a.out 
0804a000-0804b000 rw-p 00001000 00:25 268562602 /home/user/test/a.out 
0804b000-0806c000 rw-p 00000000 00:00 0   [heap] 
b7448000-b744b000 rw-p 00000000 00:00 0 
b744b000-b75b2000 r-xp 00000000 08:01 1365267 /lib/libc-2.14.1.so 
b75b2000-b75b4000 r--p 00167000 08:01 1365267 /lib/libc-2.14.1.so 
b75b4000-b75b5000 rw-p 00169000 08:01 1365267 /lib/libc-2.14.1.so 
b75b5000-b75b8000 rw-p 00000000 00:00 0 
b75b8000-b75d3000 r-xp 00000000 08:01 1179017 /usr/local/gcc/gcc-cilk/lib/libgcc_s.so.1 
b75d3000-b75d4000 r--p 0001a000 08:01 1179017 /usr/local/gcc/gcc-cilk/lib/libgcc_s.so.1 
b75d4000-b75d5000 rw-p 0001b000 08:01 1179017 /usr/local/gcc/gcc-cilk/lib/libgcc_s.so.1 
b75d5000-b75fe000 r-xp 00000000 08:01 1365275 /lib/libm-2.14.1.so 
b75fe000-b75ff000 r--p 00028000 08:01 1365275 /lib/libm-2.14.1.so 
b75ff000-b7600000 rw-p 00029000 08:01 1365275 /lib/libm-2.14.1.so 
b7622000-b7624000 rw-p 00000000 00:00 0 
b7624000-b770b000 r-xp 00000000 08:01 1179021 /usr/local/gcc/gcc-cilk/lib/libstdc++.so.6.0.19 
b770b000-b770f000 r--p 000e7000 08:01 1179021 /usr/local/gcc/gcc-cilk/lib/libstdc++.so.6.0.19 
b770f000-b7710000 rw-p 000eb000 08:01 1179021 /usr/local/gcc/gcc-cilk/lib/libstdc++.so.6.0.19 
b7710000-b7718000 rw-p 00000000 00:00 0 
b7718000-b7737000 r-xp 00000000 08:01 1365260 /lib/ld-2.14.1.so 
b7737000-b7738000 r--p 0001f000 08:01 1365260 /lib/ld-2.14.1.so 
b7738000-b7739000 rw-p 00020000 08:01 1365260 /lib/ld-2.14.1.so 
bfa18000-bfa39000 rw-p 00000000 00:00 0   [stack] 
ffffe000-fffff000 r-xp 00000000 00:00 0   [vdso] 
Aborted 

這裏是代碼:

#include <unistd.h> 
#include <cstdio> 
#include <cstring> 
#include <iostream> 
using namespace std; 

class File 
{ 
protected: 
    unsigned char recordLen; 
    unsigned location; 
    unsigned fileSize; 
    unsigned char filenameLen; 
    char* filename; 

public: 
    File(){filename = NULL;} 
    File(FILE* readFromHere, const char* name) 
    { 
     recordLen = 152; 
     location = 20003; 
     fileSize = 16348; 
     filenameLen = strlen(name); 
     filename = new char[filenameLen + 1]; 
     strcpy(filename, name); 
     cout << "File(" << filename << ")\n"; 
    } 
    File(const File& o) 
    { 
     if (o.filename == NULL) 
      filename = o.filename; 
     else 
     { 
      filename = new char[o.filenameLen + 1]; 
      strcpy(filename, o.filename); 
     } 
    } 
    ~File() 
    { 
     if (filename) 
      cout << "~File(" << filename << ")\n"; 
     else 
      cout << "~File(null)\n"; 
     if (filename != NULL) 
      delete[] filename; 
    } 
}; 

class Directory : public File 
{ 
protected: 
    int numContents; 
    File* contents; 
public: 
    Directory(FILE* readFromHere, const char* name) 
     : File(readFromHere, name) 
    { 
     numContents = 2; 
     contents = new File[numContents]; 
     contents[0] = File(readFromHere, "a.out"); 
     //~ contents[1] = File(readFromHere, "otherfile.cpp"); 
    } 
    ~Directory() 
    { 
     if (filename) 
      cout << "~Directory(" << filename << ")\n"; 
     else 
      cout << "~Directory(null)\n"; 
     if (contents != NULL) 
      delete[] contents; 
    } 
}; 

int main() 
{ 
    Directory d(NULL, "randname"); 
    sleep(2); 
    return 0; 
} 
+1

你可以使用'std :: string'和'std :: vector'來避免做顯式的分配並且防止這種令人頭疼的問題 – Mgetz

回答

9

您的類不遵循Rule of Three即使它擁有的資源。你有一個拷貝構造函數和一個析構函數,但不是一個拷貝賦值操作符。這意味着這一行:

contents[0] = File(readFromHere, "a.out"); 

調用默認的複製賦值運算符,它可以愉快地複製指針。有你的雙刪除問題。

+0

謝謝你指出並感謝你的好鏈接! – Ambiguities

相關問題