使用shared_ptr时的内存泄漏 [英] Memory leak while using shared_ptr

查看:219
本文介绍了使用shared_ptr时的内存泄漏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 检测到内存泄漏! 
转储对象 - >
{9370}正常块在0x000000C16B24C480,24字节长。
数据:<`h => 60 68 3D FB F6 7F 00 00 01 00 00 00 01 00 00 00
{8549}正常块在0x000000C16B25CC30,21627字节长。
数据: 0%k> FA FA FA FA 30 CC 25 6B C1 00 00 00
{5196}正常块在0x000000C16B253320,12839字节长。
数据: > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{192}正常块在0x000000C16B24CE40,24字节长。
数据: m = 20 6D 3D FB F6 7F 00 00 02 00 00 00 01 00 00 00
{191}正常块在0x000000C16B251780,16字节长。
数据: $ k> 10 DB 24 6B C1 00 00 00 00 00 00 00 00 00 00 00
{190}正常块在0x000000C16B251410,16字节长。
数据: $ k> F0 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00
{189}正常块在0x000000C16B2514B0,16字节长。
数据: $ k> D0 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00 00
{188}正常块在0x000000C16B2516E0,16字节长。
数据: $ k> B0 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00
{187}正常块在0x000000C16B251690,16字节长。
数据: $ k> 90 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00
{186}正常块在0x000000C16B251370,16字节长。
数据:< p $ k> 70 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00
{185}正常块在0x000000C16B251230,16字节长。
数据:< P $ k> 50 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00 00
{184}正常块在0x000000C16B24DA50,224字节长。
数据:< 0%k @ 3%k> 30 12 25 6B C1 00 00 00 40 33 25 6B C1 00 00 00
{156}正常块在0x000000C16B24C4E0,24字节长。
数据:< P $ k @ $ k> 50 DA 24 6B C1 00 00 00 40 CE 24 6B C1 00 00 00
{155}正常块在0x000000C16B24C300,32字节长。
数据:< ../ dataset / refer> 2E 2E 2F 64 61 74 61 73 65 74 2F 72 65 66 65 72
{154}正常块在0x000000C16B250AB0,16字节长。
数据: k> A8 F4 09 6B C1 00 00 00 00 00 00 00 00 00 00 00
对象转储完成。
'3DMM_1st.exe'(Win32):加载'C:\Windows \System32\kernel.appcore.dll'。找不到或打开PDB文件。
程序'[36392] 3DMM_1st.exe'已退出代码1(0x1).strong文本

任何人都可以帮助我吗?我有一个关于内存泄漏的问题。我不知道如何解决它,任何人都可以给一些建议,这将非常感激。



这里有一些关于我的代码的信息。我创建了一个 struct 命名 ObjectData class code> ObjectLoader ,如下所示:

  struct ObjectData {
std: :vector< glm :: vec3>顶点,法线,颜色;
std :: vector< glm :: vec2> texCoords;
std :: vector< unsigned int> vIndices,uIndices,nIndice;
};

类ObjectLoader {
private:
std :: tr1 :: shared_ptr< ObjectData>目的;
bool hasUV,hasNormals,hasColor,colorChecked,indexChecked;

std :: string parseString(std :: string src,std :: string code);
std :: vector< glm :: vec3> parseVerColor(std :: string src,std :: string code);
glm :: vec2 parseVec2(std :: string src,std :: string code);
glm :: vec3 parseVec3(std :: string src,std :: string code);
void addIndices(std :: string str);
void checkIndices(std :: string str);
void checkColors(std :: string str);
void loadObjects(std :: string objPath);

public:
ObjectLoader(std :: string objName);
〜ObjectLoader();

std :: tr1 :: shared_ptr< ObjectData> getModel();
};

这里是 getModel() code> ObjectLoader()实现代码:

  std :: tr1 :: shared_ptr< ObjectData> ObjectLoader :: getModel(){
return object;
}

ObjectLoader :: ObjectLoader(std :: string objName){
indexChecked = false;
colorChecked = false;
std :: string fileName = objName;
object = std :: tr1 :: shared_ptr< ObjectData>(new ObjectData());
}



当我测试我的代码时,我得到与内存泄漏相关的问题。 / p>

这是我的测试代码:

  std :: tr1 :: shared_ptr< ObjectLoader> loader = std :: tr1 :: shared_ptr< ObjectLoader>(new ObjectLoader(fileName)); 
std :: tr1 :: shared_ptr< ObjectData> data = loader-> getModel();
_CrtDumpMemoryLeaks();


解决方案

std :: shared_ptr



在代码中;

  std :: tr1 :: shared_ptr< ObjectLoader> loader = std :: tr1 :: shared_ptr< ObjectLoader>(new ObjectLoader(fileName)); 
std :: tr1 :: shared_ptr< ObjectData> data = loader-> getModel();
_CrtDumpMemoryLeaks();

loader data 析构函数,因此删除,直到 _CrtDumpMemoryLeaks(); 函数报告泄漏后才运行。



添加一个额外的范围可以帮助这个,否则代码需要重组。

  {
std :: tr1 :: shared_ptr< ObjectLoader> loader = std :: tr1 :: shared_ptr< ObjectLoader>(newObjectLoader(fileName));
std :: tr1 :: shared_ptr< ObjectData> data = loader-> getModel();
} //析构函数在这里运行...
_CrtDumpMemoryLeaks();


 Detected memory leaks!
Dumping objects ->
{9370} normal block at 0x000000C16B24C480, 24 bytes long.
 Data: <`h=             > 60 68 3D FB F6 7F 00 00 01 00 00 00 01 00 00 00 
{8549} normal block at 0x000000C16B25CC30, 21627 bytes long.
 Data: <        0 %k    > FA FA FA FA FA FA FA FA 30 CC 25 6B C1 00 00 00 
{5196} normal block at 0x000000C16B253320, 12839 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
{192} normal block at 0x000000C16B24CE40, 24 bytes long.
 Data: < m=             > 20 6D 3D FB F6 7F 00 00 02 00 00 00 01 00 00 00 
{191} normal block at 0x000000C16B251780, 16 bytes long.
 Data: <  $k            > 10 DB 24 6B C1 00 00 00 00 00 00 00 00 00 00 00 
{190} normal block at 0x000000C16B251410, 16 bytes long.
 Data: <  $k            > F0 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00 
{189} normal block at 0x000000C16B2514B0, 16 bytes long.
 Data: <  $k            > D0 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00 
{188} normal block at 0x000000C16B2516E0, 16 bytes long.
 Data: <  $k            > B0 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00 
{187} normal block at 0x000000C16B251690, 16 bytes long.
 Data: <  $k            > 90 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00 
{186} normal block at 0x000000C16B251370, 16 bytes long.
 Data: <p $k            > 70 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00 
{185} normal block at 0x000000C16B251230, 16 bytes long.
 Data: <P $k            > 50 DA 24 6B C1 00 00 00 00 00 00 00 00 00 00 00 
{184} normal block at 0x000000C16B24DA50, 224 bytes long.
 Data: <0 %k    @3%k    > 30 12 25 6B C1 00 00 00 40 33 25 6B C1 00 00 00 
{156} normal block at 0x000000C16B24C4E0, 24 bytes long.
 Data: <P $k    @ $k    > 50 DA 24 6B C1 00 00 00 40 CE 24 6B C1 00 00 00 
{155} normal block at 0x000000C16B24C300, 32 bytes long.
 Data: <../dataset/refer> 2E 2E 2F 64 61 74 61 73 65 74 2F 72 65 66 65 72 
{154} normal block at 0x000000C16B250AB0, 16 bytes long.
 Data: <   k            > A8 F4 09 6B C1 00 00 00 00 00 00 00 00 00 00 00 
Object dump complete.
'3DMM_1st.exe' (Win32): Loaded 'C:\Windows\System32\kernel.appcore.dll'. Cannot find or open the PDB file.
The program '[36392] 3DMM_1st.exe' has exited with code 1 (0x1).strong text

Can anyone help me? I got a problem relating to memory leaks. I don't know how to solve it, can anyone can give some suggestions, it will greatly be appreciated.

Here are some info about my code. I created a struct named ObjectData and a class named ObjectLoader just as follows:

struct ObjectData {
    std::vector <glm::vec3> vertices, normals, colors;
    std::vector <glm::vec2> texCoords;
    std::vector <unsigned int> vIndices, uIndices, nIndices;
};

class ObjectLoader {
    private:
    std::tr1::shared_ptr<ObjectData> object;
    bool hasUV, hasNormals, hasColor, colorChecked, indexChecked;

    std::string parseString(std::string src, std::string code);
    std::vector<glm::vec3> parseVerColor(std::string src, std::string code);
    glm::vec2 parseVec2(std::string src, std::string code);
    glm::vec3 parseVec3(std::string src, std::string code);
    void addIndices(std::string str);
    void checkIndices(std::string str);
    void checkColors(std::string str);
    void loadObjects(std::string objPath);

    public:
    ObjectLoader(std::string objName);
    ~ObjectLoader();

    std::tr1::shared_ptr<ObjectData> getModel();
};

Here is the getModel() and ObjectLoader() implementation code:

std::tr1::shared_ptr<ObjectData> ObjectLoader::getModel() {
    return object;
}

ObjectLoader::ObjectLoader(std::string objName) {
    indexChecked = false;
    colorChecked = false;
    std::string fileName = objName;
    object = std::tr1::shared_ptr<ObjectData>(new ObjectData());
}

When I test my code I get the problem related to the memory leaks.

Here is my test code:

    std::tr1::shared_ptr<ObjectLoader> loader = std::tr1::shared_ptr<ObjectLoader>(new ObjectLoader(fileName));
    std::tr1::shared_ptr<ObjectData> data = loader->getModel();
    _CrtDumpMemoryLeaks();

解决方案

You have a problem detecting the leaks because of the scope of the std::shared_ptr.

In the code;

std::tr1::shared_ptr<ObjectLoader> loader = std::tr1::shared_ptr<ObjectLoader>(new ObjectLoader(fileName));
std::tr1::shared_ptr<ObjectData> data = loader->getModel();
_CrtDumpMemoryLeaks();

The loader and data destructors, and hence the deletions, do not run until after the _CrtDumpMemoryLeaks(); function reports the leaks.

Adding an extra scope can help with this, else the code needs to be restructured.

{
    std::tr1::shared_ptr<ObjectLoader> loader = std::tr1::shared_ptr<ObjectLoader>(new ObjectLoader(fileName));
    std::tr1::shared_ptr<ObjectData> data = loader->getModel();
} // destructors run here...
_CrtDumpMemoryLeaks();

这篇关于使用shared_ptr时的内存泄漏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆