首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否检测到指针引用可能的内存泄漏?

是否检测到指针引用可能的内存泄漏?
EN

Stack Overflow用户
提问于 2012-07-10 13:35:12
回答 4查看 1K关注 0票数 2

我有没有内存泄漏?我正在构建一个游戏引擎,我有一些我认为是正确的代码,但我的代码分析工具( cppcheck )显示我有内存泄漏,这可能是误报。

我有一个(这是一个简单的用例)

代码语言:javascript
复制
class Mesh
{
D3DMATERIAL9* mpMaterials;
LPDIRECT3DTEXTURE9* mpTextures;

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

在我的网格类中,我有一些directx指针,当我加载网格时,我发送一个shared_ptr到我的图形管理器类中的一个函数来加载。

在这个函数中,我做了

代码语言:javascript
复制
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;),我就没有泄漏内存,对吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-10 14:06:39

我在cppcheck中编写了内存泄漏检查。我同意这是一个假阳性。我会修好的。

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

票数 3
EN

Stack Overflow用户

发布于 2012-07-10 13:44:58

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-10 13:52:51

只要你在某个时刻销毁了你的网格对象,你就不会泄露你的两个数组。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11407175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档