2016-10-21 20 views
0

私のC++のゲームでは、EnemyTypeへのポインタの配列を持っています。私は、メモリリークを検出するためのVisual漏れ検出器を使用し、それは私が次のコードでリークを持っている私に言っています:配列を作成するときにC++のメモリリークが発生する

vector<EnemyType*> enemyTypes(number_of_lines); 

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

はのはnumber_of_linesは、この場合は3であるとしましょう。ここで私は漏れをどうやって作り出しているのでしょうか?それについて何かできますか?

私は約1ヶ月前にC++の学習を始めました。私はまだ毎日勉強していますが、誰かが私を説明することなく(このような)理解できません。

EDIT:私はプレーンな配列の代わりにベクトルを使うようにコードを修正しました。あなたの元のコードから

+1

ベクターを試しましたか? –

+0

メモリを解放するのを忘れると、リークが作成されます。上記のコードはこの問題を示していません。 MCBを作成します。 –

+1

'enemyTypes'がメソッドに対してローカルで、各要素(および配列自体)を'削除 'しないと、リークします。 'std :: vector 'の使用を検討してください。ダイナミックメモリは常に望ましいとは限りません。また、使用すると、適切なスマートポインタが管理部分を活用することができます。 – Jack

答えて

1

:あなたはnewを使用してC++でメモリを割り当てるとき

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

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

は、あなたが(あなたがあなたのenemyTypesのような配列を、割り当てられた場合、またはdelete[]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); 
0

new演算子を使用する場合は、作成した各オブジェクトを削除することを確認します。

良い選択肢は、STLまたはブーストライブラリからのスマートポインタを使用することです。オブジェクトが未使用になったときにオブジェクトを自動的に削除し、メモリリークを回避します。

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

Aわずかに修正されたバージョンが存在しなくなります。その結果、演算子newの最初の使用法で作成されたメモリは決して解放されず、ポインタを指すポインタは存在しません。そのメモリにアクセスすることはできないので、ループ内のオペレータnewの結果にアクセスすることはできません(これらの結果が格納されるのは、enemyTypesによって識別される動的に割り当てられた配列に限られます)。

したがって、その時点でメモリはすべてリークされます(ダイナミックに割り当てられたメモリは、標準のC++境界外の技術を使用しない限り、プログラムによってリカバリできません)。さまざまなメモリチェッカー - もしあなたがそれらを使うならば - 関数が返ってくるところで、あるいはプログラムが終了するときに、それに応じてリークが報告されます。

0

私は決してメモリを解放していませんでしたが(他の人が私に言ったように)、Visual Leak Detectorはこのメモリがどこに割り当てられているのか、漏れがどこで起こったのかわかりませんでした。

関連する問題