2011-03-23 29 views
0

我有這樣的結構:C++使用刪除與浮標陣的結構體的二維矢量

struct foo { 

    int a,b,c; 

    float d; 

    float *array1; 

    float *array; 

}; 

現在我用這個結構爲8×8的二維矢量就像這樣:

vector< vector<foo> > bar(8); 
for (int i = 0; i < 8; i++) 
    bar[i].resize(8); 

在我的計劃,「酒吧」現在充滿了數據,例如:

bar[1][5].array1 = new float[256]; 
bar[1][5].array2 = new float[256]; 
// Et cetera. 

我怎樣才能使所使用的內存正確嗎?

我試過一個for循環的釋放每float數組是這樣的:

delete [] bar[i][j].array1; 

但是,這將導致在運行時堆例外。

+1

如果你的數組總是有256個元素,你應該考慮以這種方式聲明它們:'''''''''''float array1 [256]; float [256] array2;' – pyon 2011-03-23 22:36:33

回答

0

這最簡單的NULL的刪除檢查方法來完成,這將是創建一個構造函數和析構函數:

struct foo { 

    int a,b,c; 
    float d; 
    float *array1; 
    float *array; 

    foo() 
    { 
    array1 = array = 0; 
    } 

    ~foo() 
    { 
    delete [] array1; 
    delete [] array; 
    } 

}; 

更妙的是成員跟蹤陣列1大小數組,以便複製構造函數和/或賦值運算符可以根據需要克隆它們。

注意:「最簡單」我並不是指「最好」。 :)

2

向您的struct添加析構函數以清理這些成員。

或者您可以像EduardoLeón建議的那樣去做,並將它們分配爲結構的一部分。

float array1[256]; 

代替

float *array1; 
2

首先,你應該使用vector<float>代替float*arrays are evil

其次,你釋放記憶的方式是正確的,錯誤必須在其他地方。

1

你能發佈一個實際的代碼片段嗎?如果您只是刪除了要分配的元素,則應該沒有問題。

我建議有兩件事情,以幫助縮小下來:

  1. null分配給您的初始化所有的指針,而不是原浮動指針
  2. 使用shared_ptr的類型 - 它們將被自動清理時沒有參考文獻。
0

你有這個析構函數添加到您的結構FOO:

~foo() { 
    delete []array1; 
    delete []array2; 
} 

我建議還創建構造爲您foo初始化這兩個指針爲0:

foo() 
:a(0),b(0),c(0), 
d(0.0), array1(0), array2(0) 
{} 
1

我建議您使用符合您需要的矢量或其他stl容器。

如果它必須是陣列 - 更好的使用析構函數在你的結構,所以你不必去想手動清理:

struct foo 
    { 
    int a,b,c; 
    float d; 
    float *array1; 
    float *array2; 

    foo() 
     : a(0), 
     b(0), 
     c(0), 
     d(0.0), 
     array1(NULL), 
     array2(NULL) 
    { } 

    ~foo() 
    { 
     delete [] array1; 
     delete [] array2; 
    } 
    }; 

編輯:於delete []

+0

調用'delete'時不需要檢查null。 – linuxuser27 2011-03-23 23:00:21