2014-11-05 164 views
1

我在類內部有一個const std::vector<double> *vecPtr。我想正確釋放內存,那麼我的destructor應該是什麼樣子?刪除指向矢量的指針

我試過~ClassA() { delete[] vecPtr; },但我得到一個錯誤

*** Error in `./test': free(): invalid pointer: 0x00007fff8c643a98 *** 
Aborted (core dumped) 

是否delete[]工作只有矢量充滿指針?

編輯:

我用vecPtr這樣的:vecPtr = &vec;

如果我只使用delete我得到*** Error in ./test': double free or corruption (fasttop): 0x00000000008fcb20 ***

+0

指向矢量的指針幾乎總是一個錯誤。嘗試使用矢量。 – 2014-11-05 10:28:49

+0

這是爲什麼,我想避免複製 – TheGuyWithStreetCred 2014-11-05 10:33:25

+0

你不能避免通過在類成員前面粘貼'*'來進行復制。 – 2014-11-05 10:42:14

回答

5

這取決於你如何創建vecPtr。如果您使用vecPtr = new std::vector<double>,你應該使用delete vecPtr;

如果vecPtrarray new創建,如vecPtr = new std::vector<double>[3];,你應該使用array deletedelete[] vecPtr;

編輯

如果使用vecPtr = &vec;,如果vec是一個使用自動內存的自動變量,或者是一個靜態變量或全局變量,它使用了靜態內存,你不應該刪除它,它會被自動解除分配LY。只有動態內存可以被刪除。

4

刪除[]。它用於刪除數組。

delete vecPtr; 

您可能不應該使用指向vector的指針,因爲沒有太多理由。

0
const std::vector<double> *vecPtr 

vecPtr是指向「矢量」的指針,即單個對象。不要認爲它是一個數組,而是使用數組刪除調用(無論如何都是向後兼容的C數組),但將其視爲它是一個指向對象的指針。

例如,如果你寫你自己的Vector類,讓我們把它叫做vecarray,那麼你將有:

const vecarray *vecPtr. 

你會使用delete vecPtr顯然刪除。向量和其他stl容器類沒有區別。

0

那麼,你的編輯並沒有真正澄清,實際上引入了更多的問題。 vec實際上是一個自動變量,因此永遠不應該被刪除?我們不知道。

要解答您的含義相當模糊的問題,如果您在免費商店中分配了一個矢量,應該只用delete ptr刪除該矢量。如果您的ptr實際上指向一個數組,那麼您應該使用delete [] ptr的數組刪除。這至少顯然不是這種情況。如果您只是將矢量地址分配給ptr,那麼您應該永遠不要刪除它。像這樣的所有權相互混淆引起了一系列問題。