我有没有内存泄漏?我正在构建一个游戏引擎,我有一些我认为是正确的代码,但我的代码分析工具( 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类中的指针指向实例化的内存,并且只要我稍后正确地销毁网格对象(并在网格析构函数中调用delete[] mpMaterials;delete[] mpTextures;),我就没有泄漏内存,对吗?
发布于 2012-07-10 14:06:39
我在cppcheck中编写了内存泄漏检查。我同意这是一个假阳性。我会修好的。
请随时在cppcheck问题跟踪器中报告它。
发布于 2012-07-10 13:44:58
如果您只调用加载函数一次,则可能不会泄漏内存。无论如何,您的类设计看起来非常脆弱,因为没有对这些指针进行适当的数据封装。如果您有用于加载函数中加载的数据的setter,那会更好。这将允许拥有数据的类在setter被多次调用的情况下删除旧数据。
发布于 2012-07-10 13:52:51
只要你在某个时刻销毁了你的网格对象,你就不会泄露你的两个数组。
静态分析工具出现误报的情况并不少见,尤其是在检查内存泄漏等运行时问题时。如果您对内存泄漏感兴趣,请尝试使用Valgrind等运行时分析工具。
https://stackoverflow.com/questions/11407175
复制相似问题