2011-12-11 39 views
0

可以說我有一個對象,它的用途是容納一堆爲對象類型MyObject的指針,並且可以說我想要的功能,增加了新的MyObjects到集合,像這樣:如何分配堆指針

void MyCollection::addObject(){ 
    MyObject *newObject = new MyObject(); 
    MyCollection.add(mycollection, newObject); 
} 

可以說,MyCollection.add接受一個特定的集合對象和一個指針,並以某種方式在內部存儲它。然而,這個函數的問題在於newObject自身是持久化的時候,* newObject指針會在函數調用後被銷燬,所以add()函數不再有一個指向該對象的指針。有沒有什麼好方法可以讓某個持久指針?

謝謝

+0

我會說,「是的,這可以完成」;很可能是「使用標準庫可以做得更好」,並且在任何情況下,您都沒有給出足夠的細節,代碼和上下文以允許有意義的響應。 –

+0

newObject變量將被銷燬,但創建的對象不會像您已將指針存儲在集合中一樣 – Ankit

回答

5

然而與此功能的問題,而NEWOBJECT本身 是持久的,所以* NEWOBJECT指針獲取 函數調用後銷燬,因此add()函數不再有指針 真正指向的對象。

這背離了對物體和指針如何工作的巨大誤解。

指針是一個地址。 new在堆上創建一個對象並返回地址。當您將該地址傳遞到集合時,集合將獲得地址的副本,這與您從new獲得的地址完全相同。當變量newObject超出範圍並被銷燬時,集合仍具有地址的副本,並且地址仍指向該對象。無論您製作和銷燬的地址有多少份,地址仍然很好,地址指向的對象仍然很好。

實際上,您從new獲取的地址是new內部生成的地址的副本,並且原始內部值被銷燬。當你說MyObject *newObject = new MyObject();你正在製作另一個副本。但這並不重要,因爲每個地址的副本都與其他地址一樣好。

1

基於堆棧的數據 - 比如你的指針 - 本身並沒有被「銷燬」。變量本身超出範圍,但它包含的數據 - 即MyObject對象的地址 - 仍然完全有效。如果add()方法複製指針的值,則全部都是好的。

順便說一句,我希望的add()實施只是

myVector.push_back(newObject); 

其中myVectorstd::vector一個實例。無需重新發明輪子!

0

寫的代碼很好。該指針將(必須)由add()方法複製,其簽名大概是void add(MyObject*)

順便說一句,你的C++這裏是無效的:

MyCollection.add(mycollection, newObject); 

這也許應該是:

mycollection.add(newObject); 
0

這是沒有問題的。一個定義良好的add函數會複製指針,所以原來的指針超出範圍不會引起任何問題。