2

メモリリークはありますか?ゲーム エンジンを構築していて、正しいと思われるコードがいくつかありますが、コード分析ツール ( cppcheck ) で、メモリ リークがあると表示されます。これはおそらく誤検出です。

私は持っています(これは必要最小限のユースケースです)

class Mesh
{
D3DMATERIAL9* mpMaterials;
LPDIRECT3DTEXTURE9* mpTextures;

D3DMATERIAL9*& GetMaterials() { return mpMaterials; }
LPDIRECT3DTEXTURE9*& GetTexures() {return mpTextures; }
};

私のメッシュ クラスにはいくつかの directx ポインターがあります。メッシュをロードするときに、shared_ptr をグラフィックス マネージャー クラスの関数に送信してロードします。

その機能で私は

void Renderer::LoadMesh( shared_ptr<Mesh> myMesh)
{
// other code
D3DMATERIAL9*& pMaterials= myMesh->GetMaterials();
LPDIRECT3DTEXTURE9*& pTextures= myMesh->GetTextures();
// other code

// and then instantiate them

pMaterials = new D3DMATERIAL9[matCount];
pTextures = new LPDIRECT3DTEXTURE9[texCount];

// And then i do some stuff with those objects.
}

この関数の最後は、cpp チェックで pMaterials と pTextures がメモリ リークしたことを示しています。pMaterials と pTextures は myMesh 内のポインターへの参照であり、Mesh クラスのポインターはそのインスタンス化されたメモリを指しているため、インスタンス化したメモリはそこに存在し、後で適切に Mesh オブジェクトを破棄する限り (そして、delete[] mpMaterials; delete[] mpTextures; をメッシュ デストラクタで呼び出します) メモリ リークはありませんよね?

4

4 に答える 4

3

cppcheck にメモリ リーク チェックを記述しました。私はそれが偽陽性であることに同意します。私はそれを修正します。

cppcheck issue tracker で気軽に報告してください。

于 2012-07-10T06:06:39.073 に答える
1

そのロード関数を 1 回だけ呼び出した場合、メモリ リークが発生していない可能性があります。とにかく、これらのポインターの適切なデータカプセル化がないため、クラスの設計は非常に脆弱に見えます。ロード関数でロードされるデータのセッターがあればより良いでしょう。これにより、セッターが複数回呼び出された場合に、データを所有するクラスが古いデータを削除できるようになります。

于 2012-07-10T05:44:57.633 に答える
1

ある時点で Mesh オブジェクトを破棄する限り、2 つの配列がリークすることはありません。

静的分析ツールで誤検知が発生することは珍しくありません。特に、メモリ リークなどの実行時の問題をチェックする場合に顕著です。メモリ リークに関心がある場合は、Valgrind などのランタイム分析ツールを使用してみてください。

于 2012-07-10T05:52:51.057 に答える
1

いいえ、コードは問題ないようです。

Valgrind は「無効な削除/解放/再割り当て」と言っていますが、その原因はおそらく、割り当てたことのないポインタを解放した (ように見える) ことです。

ここでポインタを使って面白いことをしているので、おそらく誤検知があります。

于 2012-07-10T05:59:31.273 に答える