2013-03-01 59 views
0

刪除一個動態分配的數組時遇到了一些麻煩,我不是100%確定原因。我對這個數組做的唯一的事情就是單獨複製一些值(在一個for循環中),在另一個例程中進行驗證,以驗證它是否正常工作。從刪除動態數組中刪除Seg錯誤

下面是類的聲明:

std::complex<float> * frameData; 

實例中構造:

this->frameData = new std::complex<float>[n]; 
srand(time(NULL)); 
std::complex<float> randUnityRoot; 

for(int i = 0; i < this->n; i++){ 
    randUnityRoot = std::polar(1.0, 2*M_PI * (rand() % 1000000)/1e06); 
    this->frameData[i] = randUnityRoot; 
} 

缺失析構函數(這是在回溯中提到的管線70):

delete[] this->frameData; 

程序完成後段錯誤後的gdb回溯:

(gdb) f 4 
#4 0x00007ffff7bc579c in Frame::~Frame (this=0x602940, 
__in_chrg=<optimized out>) at Frame.cpp:70 
70  delete[] this->frameData; 
(gdb) f 3 
#3 0x00007ffff7669b96 in ??() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) f 2 
#2 0x00007ffff765f39e in ??() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) f 1 
#1 0x00007ffff7624b8b in abort() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) f 0 
#0 0x00007ffff7621425 in raise() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) 

我一直在盯着這一段時間,並沒有想法。我想我會轉向蜂巢的想法。如果您想了解更多信息,請告訴我。謝謝!

編輯:我更新了一切以矢量和矢量*爲基礎的方法。

沒有segfaults :)。

要從此但是產生某種「獲得的知識」,另一類我曾要求是這樣的:

std::complex<float> * frameGet; 
frameGet = this->Frame->getFrame(); 
// Do stuff with frameGet 
//THIS NEXT LINE IS THE BAD PART 
delete[] frameGet; 

一半的問題,一半斷言:刪除[] frameGet電話上原來陣列的內容刪除?如果frameGet需要刪除應該這樣做:

frameGet = NULL; 
delete frameGet; 
+2

可能相關:[Rule of Three](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-reeree)。使用矢量。 – chris 2013-03-01 05:28:17

+0

請分享代碼。 – 2013-03-01 05:34:36

+0

@chris。是的,我想我可以在這裏做到這一點。但實際上,這不應該發生。 – 2013-03-01 05:35:41

回答

0

你最有可能沒有任何拷貝構造函數,也沒有賦值運算符在你的班上明確定義。這麼形容他們在您的類的私有部分(請再無法訪問):

class Frame { 
//... 
private: 
    Frame(const Frame &); 
    Frame &operator=(const Frame &); 
// ... 
}; 

你甚至不必加以落實,並編譯器會顯示您的問題是由編譯錯誤的精確位置。

關於你問題的後半部分。出於某種原因,您認爲如果您將一個原始指針指定給另一個,則會複製該內存並需要分別刪除它們。情況並非如此,原始指針只是內存中的數字地址。所以:

int *pi = new int[N]; // now pi has address of memory reserved by new, lets say 0x1234 
int *api = pi; // now api has the same address 0x1234 as pi 
delete[] api; // you tell environment that you do not need memory at address 0x1234 anymore 
delete[] pi; // you tell environment that you do not need memory at address 0x1234 again, which is error 

事實上你只是一個指針分配給另一個直接或做到這一點通過函數結果或參數傳遞不會改變任何東西。

+0

那麼,爲什麼我需要複製構造函數,當我從來沒有做任何與該數組以外的任何訪問單個可變元素a la ** float something = this-> frameData [i] .re()+ 3 ** – 2013-03-01 05:40:35

+0

@史蒂夫關鍵是我們不*真的*相信你不是在默默地複製某處;-)。使複製ctor和複製分配無法訪問和重新編譯將毫無疑問證明這不是正在發生的事情。 – us2012 2013-03-01 05:43:02

+0

@SteveStevens將2行代碼放入代碼中,並且編譯時間不會太長,爲什麼不問問爲什麼需要它? – Slava 2013-03-01 05:45:53