簡體   English   中英

使用shared_ptr時發生內存泄漏

[英]Memory leak while using shared_ptr

 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

誰能幫我? 我遇到了與內存泄漏有關的問題。 我不知道如何解決,任何人都可以提出一些建議,我們將不勝感激。

這是有關我的代碼的一些信息。 我創建了一個名為ObjectDatastruct和一個名為ObjectLoaderclass ,如下所示:

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();
};

這是getModel()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());
}

當我測試代碼時,我遇到了與內存泄漏有關的問題。

這是我的測試代碼:

    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();

直到_CrtDumpMemoryLeaks();之后, loaderdata析構函數以及刪除操作才會運行_CrtDumpMemoryLeaks(); 功能報告泄漏。

添加額外的作用域可以幫助解決此問題,否則需要重新構建代碼。

{
    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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM