2010-07-22 81 views
0

我有一個類呼叫電網。該類包含兩個用於存儲網格的2d char數組... 該類有兩個用於爲網格創建內存並釋放網格內存的函數。雙免費電話號碼

Grid.h

private: 
char **gridOne; 
char **gridTwo; 

Grid.cpp

void Grid::allocateGridMem() 
{ 
    _gridOne = new char*[gridRowCount()]; 
    _gridTwo = new char*[gridRowCount()]; 

    for(int i =0; i < gridColumnCount(); ++i){ 
     *(_gridOne + i) = new char[gridColumnCount()]; 
     *(_gridTwo + i) = new char[gridColumnCount()]; 
    } 
} 

void Grid::dealocateGridMem() 
{ 
    if(_gridOne != 0) 
    { 
     for(int i =0; i < gridRowCount(); ++i){ 
     delete [] *(_gridOne + i); 
     } 
     delete [] _gridOne; 
     _gridOne = 0; 
    } 

    if(_gridTwo != 0) 
    { 
     for(int i =0; i < gridRowCount(); i++){ 
     delete [] *(_gridTwo + i); 
     } 
     delete [] _gridTwo; 
     _gridTwo = 0; 
    } 
} 

的問題是發生在我收到以下錯誤的存儲器的解除分配。

*** glibc detected *** ./a.out: double free or corruption (out): 0x088c9318 *** 
    ======= Backtrace: ========= 
    /lib/tls/i686/cmov/libc.so.6(+0x6b591)[0xb756c591] 
    /lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0xb756dde8] 
    /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb7570ecd] 
    /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb775c741] 
    /usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0xb775c79d] 
    ./a.out[0x804a7b9] 
    ./a.out[0x8049cb6] 
    ./a.out[0x804b8f3] 
    ./a.out[0x804c06a] 
    ./a.out[0x804b71d] 
    ./a.out[0x80498eb] 
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb7517bd6] 
    ./a.out[0x8049521] 
    ======= Memory map: ======== 
    08048000-0804f000 r-xp 00000000 08:02 920728  /home/a.out 
    0804f000-08050000 r--p 00006000 08:02 920728  /home/a.out 
    08050000-08051000 rw-p 00007000 08:02 920728  /home/a.out 
    088c7000-088e8000 rw-p 00000000 00:00 0   [heap] 
    b7300000-b00 rw-p 00000000 00:00 0 
    b00-b7400000 ---p 00000000 00:00 0 
    b7500000-b7501000 rw-p 00000000 00:00 0 
    b7501000-b7654000 r-xp 00000000 08:02 19796293 /lib/tls/i686/cmov/libc-2.11.1.so 
    b7654000-b7655000 ---p 00153000 08:02 19796293 /lib/tls/i686/cmov/libc-2.11.1.so 
    b7655000-b7657000 r--p 00153000 08:02 19796293 /lib/tls/i686/cmov/libc-2.11.1.so 
    b7657000-b7658000 rw-p 00155000 08:02 19796293 /lib/tls/i686/cmov/libc-2.11.1.so 
    b7658000-b765b000 rw-p 00000000 00:00 0 
    b765b000-b7678000 r-xp 00000000 08:02 19791955 /lib/libgcc_s.so.1 
    b7678000-b7679000 r--p 0001c000 08:02 19791955 /lib/libgcc_s.so.1 
    b7679000-b767a000 rw-p 0001d000 08:02 19791955 /lib/libgcc_s.so.1 
    b767a000-b767b000 rw-p 00000000 00:00 0 
    b767b000-b769f000 r-xp 00000000 08:02 19796301 /lib/tls/i686/cmov/libm-2.11.1.so 
    b769f000-b76a0000 r--p 00023000 08:02 19796301 /lib/tls/i686/cmov/libm-2.11.1.so 
    b76a0000-b76a1000 rw-p 00024000 08:02 19796301 /lib/tls/i686/cmov/libm-2.11.1.so 
    b76a1000-b778a000 r-xp 00000000 08:02 28708531 /usr/lib/libstdc++.so.6.0.13 
    b778a000-b778b000 ---p 000e9000 08:02 28708531 /usr/lib/libstdc++.so.6.0.13 
    b778b000-b778f000 r--p 000e9000 08:02 28708531 /usr/lib/libstdc++.so.6.0.13 
    b778f000-b7790000 rw-p 000ed000 08:02 28708531 /usr/lib/libstdc++.so.6.0.13 
    b7790000-b7797000 rw-p 00000000 00:00 0 
    b77a5000-b77a8000 rw-p 00000000 00:00 0 
    b77a8000-b77a9000 r-xp 00000000 00:00 0   [vdso] 
    b77a9000-b77c4000 r-xp 00000000 08:02 19791897 /lib/ld-2.11.1.so 
    b77c4000-b77c5000 r--p 0001a000 08:02 19791897 /lib/ld-2.11.1.so 
    b77c5000-b77c6000 rw-p 0001b000 08:02 19791897 /lib/ld-2.11.1.so 
    bf83a000 

-bf84f000 rw-p 00000000 00:00 0   [stack] 
Aborted 

我已經檢查了我所有的指針,他們沒有被改爲其他在執行的東西,每一個制衡一個能想到的是發生儀式。在過去的幾個小時裏,我一直在拉我的頭髮,但仍然一無所獲。

我在ubuntu 10系統上用gcc運行這個。

還應該注意,我已經改變了這個職位的名稱等,並只包括我認爲有價值的代碼。

編輯:

固定的語法問題,但原來的代碼有這個我剛纔輸入它快速,沒有校對。

任何幫助都非常感謝,值得在我的書中金星。 我是gdb的高級用戶,並且在這個問題上使用了它,但是我認爲這可能是外部庫中的問題。我看不出有關內存的任何問題,以及它的範圍,希望有人看到類似的內容。出於所有目的,這段代碼很好。

+0

你會得到一個行號,代碼中的等價行是什麼? – ChrisF 2010-07-22 10:03:44

+1

我建議你學習valgrind和gdb。 – Scharron 2010-07-22 10:04:06

+1

您是否在製作此對象的副本,但沒有複製\ _gridOne/\ _ gridTwo的複製構造函數? – nos 2010-07-22 10:37:02

回答

0

sudo apt-get install valgrind,運行valgrind myprogram和99%的內存分配錯誤變得明顯。

至少有一個問題是,您正在將該行(應該是_gridOne[i])分配到數組指針的頂部。用-Werror -Wall -W進行編譯,這樣的許多錯誤在編譯時會變得很明顯。

1

可能它應該是_gridOne[i]而不是_gridOneallocateGridMem的循環內。但是,請儘可能避免這種低級操作,並使用高級組件(如boost::numeric::ublas::matrix)代替。

+0

絕對應該是'_gridOne [i]'和'_gridTwo [i]'在'allocateGridMem'中,是的。 – schnaader 2010-07-22 10:06:40

3

變化

for(int i =0; i < gridColumnCount(); ++i){ 
    _gridOne = new char[gridColumnCount()]; 
    _gridTwo = new char[gridColumnCount()]; 
} 

for(int i =0; i < gridRowCount(); ++i){ 
    _gridOne[i] = new char[gridColumnCount()]; 
    _gridTwo[i] = new char[gridColumnCount()]; 
} 

此外,不要做

*(array + i) 

array[i] 
1

這是否Grid類你的有拷貝構造函數賦值運算符?否則,如果您複製這些對象,則會發生此錯誤。

我建議你停止上工資源管理,使Grid薄的二維包裝物管理內存std::vector<char>左右。

+0

似乎有人經歷了所有答案,並投了反對票。我想沒有理由有人會關心發佈? – sbi 2010-07-23 09:46:55

0

使用STL和載體:

class Grid 
{ 
    std::vector<std::vector<char> > grid1; 
    std::vector<std::vector<char> > grid2; 

    public: 
     Grid(int col,int row) 
      : grid1(col, std::vector<char>(row)) 
      , grid2(col, std::vector<char>(row)) 
     {} 
}; 

全部完成。

如果你想看看提升矩陣的幻想。