簡體   English   中英

刪除指針數組-我做對了嗎?

[英]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 ++玩樂,就應該了解一下:

關於您的編輯:有幾個區別,但是我想最重要的是:

  1. 指針數組可以包含不同類型的對象(如果它們是數組類型的子類)。
  2. 對象數組不需要任何刪除,銷毀數組時將銷毀所有對象。

絕對好

經驗法則是: 將對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM