簡體   English   中英

創建數組時C ++內存泄漏

[英]C++ memory leak when creating an array

在我的C ++游戲中,我有一個指向EnemyType的指針數組。 我使用Visual Leak Detector來檢測內存泄漏,並告訴我以下代碼段中存在泄漏:

vector<EnemyType*> enemyTypes(number_of_lines);

for (int i = 0; i < number_of_lines; i++)
{
    enemyTypes[i] = new EnemyType();
}

假設在這種情況下number_of_lines為3。 我怎么可能在這里制造泄漏? 我可以做些什么嗎?

我大約一個月前開始學習C ++,但我仍然每天都在學習,但是如果沒有人向我解釋,我將無法理解某些東西(像這樣)。

編輯:我已經修改了代碼以使用向量而不是純數組。

從您的原始代碼:

EnemyType** enemyTypes{ new EnemyType*[number_of_lines] };

for (int i = 0; i < number_of_lines; i++)
{
    enemyTypes[i] = new EnemyType();
}

當您使用new在C ++中分配內存時,必須使用delete (或在分配數組(例如enemyTypes )時使用delete[]來取消分配內存。

我們只看到部分代碼,但是我想當您不再需要內存時,您就不會進行任何釋放。

順便說一句,您應該避免分配內存,或者通過托管指針分配內存:

#include <vector>
#include <memory>

// ...

std::vector<std::unique_ptr<EnemyType>> enemy_types(number_of_lines);

for (auto& enemy_type : enemy_types)
{
    enemy_type = std::make_unique<EnemyType>();
}

根據使用數據的方式,甚至可以避免使用指針:

std::vector<EnemyType> enemy_types(number_of_lines);

運算符new動態分配內存。

最終,一些代碼需要使用相應的運算符delete釋放該內存。 如果您的代碼不這樣做,則永遠不會釋放內存。 如果您的程序失去跟蹤(例如,用於保存new結果的指針不再存在),那將成為泄漏。

稍作修改的代碼版本

int func()
{
    EnemyType** enemyTypes{ new EnemyType*[number_of_lines] };

    for (int i = 0; i < number_of_lines; i++)
    {
         enemyTypes[i] = new EnemyType();
    }
}

當函數返回時,指針enemyTypes不再存在(因為它超出了范圍)。 結果是,第一次使用運算符new創建的內存永遠不會釋放,並且不存在指向它的指針。 由於無法訪問該內存,因此也無法訪問循環中new運算符的結果(因為存儲這些結果的唯一位置是在enemyTypes標識的動態分配的數組中)。

因此,所有內存在那一刻都會泄漏(除非您使用標准C ++范圍以外的技術,否則程序無法恢復動態分配的內存)。 各種內存檢查器(如果使用它們)將在函數返回時或程序終止時相應地報告泄漏。

使用new運算符時,請確認已刪除創建的每個對象。

一個很好的選擇是使用STL或boost庫中的智能指針。 當對象變得不使用時,它們將自動刪除您的對象,從而避免內存泄漏。

原來我從來沒有釋放過內存(就像其他人告訴我的那樣),但是Visual Leak Detector只是向我顯示了該內存的分配位置,而不是泄漏發生的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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