2016-10-21 1 views
0

В моей игре на C++ у меня есть указатель на EnemyType. Я Визуальный детектор утечек для обнаружения утечек памяти, и это говорит мне, что есть утечка в следующем фрагменте кода:Утечка памяти C++ при создании массива

vector<EnemyType*> enemyTypes(number_of_lines); 

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

Скажем number_of_lines в этом случае 3. Как возможно, что я создаю утечку прямо здесь? Могу ли я что-то сделать?

Я начал изучать C++ около месяца назад, и я все еще учился каждый день, но я не могу понять некоторые вещи (например, это), не объясняя меня.

EDIT: Я изменил код, чтобы использовать вектор вместо простого массива.

+1

Вы пытались векторов? –

+0

Вы только создаете утечку, когда забываете освободить память. Вышеприведенный код не показывает эту проблему. Создайте MCVE: http://stackoverflow.com/help/mcve –

+1

Если 'enemyTypes' является локальным для метода, и вы не' delete' каждого элемента (и самого массива), то у вас есть утечка. Рассмотрим использование 'std :: vector ', динамическая память не всегда доступна, и при ее использовании правильные интеллектуальные указатели могут использовать часть управления. – Jack

ответ

1

Из исходного кода:

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

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

При выделении памяти в C++ с использованием new, вы должны освободить его с помощью delete (или delete[], когда вы выделили массив, как ваш enemyTypes).

Мы видим только часть вашего кода, но, я думаю, вы не занимаетесь освобождением, когда вам больше не нужна память.

Кстати, вы просто должны избегать выделения памяти, или передать его через управляемые указатели:

#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); 
0

При использовании нового оператора убедитесь, что вы удалили каждый созданный объект.

Хорошей альтернативой может быть использование интеллектуальных указателей из библиотеки STL или boost. Они автоматически удалят ваш объект, когда он станет неиспользованным, что позволит избежать утечек памяти.

1

Оператор 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++).Различные проверки памяти - если вы их используете - сообщают об утечке соответственно .... либо в том месте, где функция возвращается, либо когда программа завершается.

0

Оказывается, я никогда не выпускал память (как говорили другие люди), но визуальный детектор утечек просто показал мне, где была выделена эта память, а не там, где произошла утечка.