2013-08-20 130 views
2

我想動態地創建一個指針數組。從我已閱讀直到現在這可以通過以下方式用C++做指針數組的動態創建

CPoint** data_temp; 
data_temp = new CPoint*[an_integer]; 

我以後要指針添加到這個陣列將被指向的對象。有些東西就是這樣,使用for循環

CPoint A; 
CPoint* data = &A; //I am using just a single value but data will also be an array 
*data_temp[i] = data; // where data is pointer address 

現在的問題是,如果以釋放內存我刪除指針數組data_temp將它也刪除原始對象即A

delete[] data_temp; 

我在問這是因爲我需要在稍後階段的對象。

+0

相關: http:// stackoverflow。com/questions/441831/c-calling-delete-on-the-stack-on-the-stack – olevegard

+1

[刪除指向指針的指針(作爲數組數組)](http://stackoverflow.com/questions/4193982/delete-a-pointer-to-pointer-as-array-of-arrays) – dyp

+0

我是唯一一個讀取OP *將數組*放入的數據嗎?如果您添加的指針如您在這裏展示的那樣,則不需要釋放元素(因爲您從未*分配*它們;它們是自動的)。你確實需要刪除動態分配的指針數組(你是)。如果元素*也是動態分配的內存(即'new'ed),則在釋放指針數組之前需要釋放它們。我*強烈*不鼓勵所有這些,並建議你調查['std :: vector <>'](http://en.cppreference.com/w/cpp/container/vector)的樂趣 – WhozCraig

回答

2

delete[]如果數組自身包含對象本身就是要做的事情:這些對象將被自動銷燬。然而,由於這是一個指針數組,你需要做這個空出來:

for (int i=0; i < num_objects; i++) 
{ 
    delete data_temp[i]; 
} 

delete[] data_temp; 

這將解除分配內存每個對象的指向,然後刪除該數組本身。

編輯:我只是注意到,你在堆棧上分配這些對象。如果你想將它們存儲在像這樣和管理存儲自己,你應該將它們分配在堆上,就像這樣:

CPoint* A = new CPoint(); 
data_temp[i] = A; 

...或者,如果你已經在堆棧上一個連接點,連接點,並有一個複製構造...

data_temp[i] = new CPoint(A); 
2

不,它不會。應用於指針數組的delete將刪除大小的數組(在您的情況下)an_integer

如果你真的想解除分配這些指針指向的內存,你woud要經過一個for循環

for(int i = 0; i < an_integer; i++){ 
    delete data_temp[i]; 
} 
//Then deallocate the array 
delete[] data_temp; 

這意味着,你的情況,你會不會落得「刪除」了A堆棧上的對象(會導致未定義行爲的東西)。您只會刪除等於機器上指針大小乘以an_integer的內存量。

我想說,在你的情況下,std::vector<A>將是合理和更好的。

1

不,它不會。您必須單獨循環訪問指針數組和分配堆對象(即分配了調用new的對象)。

+0

該對象不是堆棧分配的,正如我在示例中所做的嘗試使描述簡短一樣。它實際上是一個堆分配數組,然後我使用指針來訪問它。 –

0

您應該使用typedef,這對他們來說是完美的用法。

typedef CPoint* PCPoint;

這種治療PCPoint作爲數組後。