指针引用可能检测到内存泄漏?

时间:2012-07-10 05:35:12

标签: c++ pointers reference

我有内存泄漏吗? 我正在构建一个游戏引擎,我有一些代码,我认为是正确的,但我的代码分析工具(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;删除[] mpTextures;在Mesh析构函数中)我没有泄露内存吗?

4 个答案:

答案 0 :(得分:2)

我在cppcheck中编写了内存泄漏检查。我同意这是误报。我会解决它。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

只要你在某些时候破坏你的Mesh对象,你就不会泄漏你的两个数组。

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

答案 3 :(得分:1)

不,似乎你的代码还可以。

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

由于你在这里用指针做了一些有趣的事情,你可能会误报。