[英]Deleting an Array of Pointers - Am I doing it right?
對於提出有關刪除指針的問題,我感到有點愚蠢,但是我需要確保以正確的方式刪除指針,因為我目前正在執行程序的調試過程。
基本上,我在頭文件中定義了一些指針數組,如下所示:
AsteroidView *_asteroidView[16];
然后在for循環中初始化它們:
for(int i = 0; i < 16; i++)
{
_asteroidView[i] = new AsteroidView();
}
好的,到目前為止,一切正常。 當我最終需要在析構函數中刪除它們時,請使用以下代碼:
for(int i = 0; i < 16; i++)
{
delete _asteroidView[i];
}
這就是我需要做的嗎? 我感覺是這樣,但是我擔心內存泄漏。
出於興趣...與對象數組相比,指向對象的數組之間有很大區別嗎?
這是對的。 但是,您可能要考慮使用Boost.PointerContainer ,從而省去了手動資源管理的麻煩:
boost::ptr_vector<AsteroidView> _asteroidView;
for(int i = 0; i < 16; i++)
{
_asteroidView.push_back(new AsteroidView());
}
您不必管理刪除操作,容器會為您完成刪除操作。 這項技術稱為RAII ,如果您想使用C ++玩樂,就應該了解一下:
關於您的編輯:有幾個區別,但是我想最重要的是:
絕對好
經驗法則是: 將對new
每個調用與相應的delete
調用匹配(並將對new[]
每個調用與delete[]
的調用匹配)
這就是我需要做的嗎? 我感覺是這樣,但是我擔心內存泄漏。
是。 該程序正在正確分配資源。 沒有內存泄漏:)
如果您對使用std::vector
感到滿意(實際上很容易),那么當它超出范圍時,它將執行重新分配過程。 但是,類型應為-
std::vector<AsteroidView>
給定一堂課:
// this class has hidden data and no methods other than the constructor/destructor
// obviously it's not ready for prime time
class Foo {
int* bar_[16];
public:
Foo()
{
for (unsigned int i = 0; i < 16; ++i)
bar_[i] = new int;
}
~Foo()
{
for (unsigned int i= 0; i < 16; ++i)
delete bar_[i];
}
};
如果構造器正確完成,您不會泄漏內存。 但是,如果new
失敗在構造函數中失敗(如果您的內存不足, 則 new
會拋出std::bad_alloc
), 則析構函數不會運行 ,並且會發生內存泄漏。 如果這讓您感到困擾,則必須使構造函數異常安全(例如,在構造函數周圍添加try
... catch
塊,使用RAII)。 就個人而言,如果數組中的元素必須是指針,則我將僅使用Boost Pointer Container,否則將使用std::vector
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.