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 check 说 pMaterials 和 pTextures 泄露了它们的内存时。我的理解是 pMaterials 和 pTextures 是对 myMesh 中指针的引用,并且我实例化的内存存在于那里,因为 Mesh 类中的指针指向该实例化的内存,并且只要我稍后适当地销毁 Mesh 对象(并调用 delete[] mpMaterials; delete[] mpTextures; 在网格析构函数中)我没有泄漏内存对吗?

4

4 回答 4

3

我在 cppcheck 中编写了内存泄漏检查。我同意这是一个误报。我会修好它。

随时在 cppcheck 问题跟踪器中报告它。

于 2012-07-10T06:06:39.073 回答
1

如果您只调用一次加载函数,您可能不会泄漏内存。无论如何,您的类设计看起来很脆弱,因为这些指针没有适当的数据封装。如果您对加载函数中加载的数据有设置器会更好。这将允许拥有数据的类在多次调用 setter 时删除旧数据。

于 2012-07-10T05:44:57.633 回答
1

只要您在某个时候销毁您的 Mesh 对象,您就不会泄漏您的两个数组。

静态分析工具出现误报的情况并不少见,尤其是在检查内存泄漏等运行时问题时。如果您对内存泄漏感兴趣,请尝试使用运行时分析工具,例如 Valgrind。

于 2012-07-10T05:52:51.057 回答
1

不,您的代码似乎没问题。

Valgrind 说“无效的删除/释放/重新分配”,但其原因可能是您(似乎)释放了您从未分配过的指针。

由于您正在使用此处的指针做一些有趣的事情,因此您可能会误报。

于 2012-07-10T05:59:31.273 回答