以下代码100%正确吗?我正在编写游戏,而CItemElem是一个包含Item信息(例如电源等)的类。我想将这些项目的指针存储到另一个名为CChatLink的类的实例中。请看一看:

[。H]

#pragma once

class CChatLink
{
private:
    CChatLink(){}; //no new usage or global object allowed
    ~CChatLink(){};
public:
    BOOL InsertChatLink( TCHAR* szText, CItemElem *pItemElem );
    map<std::string,CItemElem*>m_mChatLink;
    static CChatLink* GetInstance( void )
    {
        static CChatLink pObj;
        return &pObj;

    }

};


[.cpp]

#include "StdAfx.h"
#include "Item.h"
#include "CChatLink.h"

BOOL CChatLink::InsertChatLink( TCHAR *szText, CItemElem* pItemElem )
{
    if( pItemElem && szText )
    {
        std::string szInsert( szText );
        CItemElem *pItem = new CItemElem; //as far as I know, it must be allocated on the heap to be inserted ^^
        pItem = pItemElem;
        m_mChatLink.insert( make_pair( szInsert, pItem ) );
        return TRUE;
    }
    return FALSE;
}


我可以通过这种方式将std::string存储到map吗?

(我目前正在学习C ++,所以请放轻松。)

最佳答案

是的,您在这里有内存泄漏:

CItemElem *pItem = new CItemElem;
pItem = pItemElem;


您只是将地址丢失到分配对象的位置。如果要插入的项目作为参数传递,为什么仍要这样做?从您的代码尚不清楚。

这是您的意思吗?:

BOOL CChatLink::InsertChatLink( TCHAR *szText, CItemElem* pItemElem )
{
    if( pItemElem && szText )
    {
        std::string szInsert( szText );
        m_mChatLink.insert( make_pair( szInsert, pItemElem ) );
        return TRUE;
    }
    return FALSE;
}


编辑:

听起来pItemElem是指向已在堆栈上分配的对象的指针。您可以将m_mChatLink更改为std::map<std::string, CItemElem>(而不是CItemElem*),或者这样:

CItemElem pItem = new CItemElem;
*pItem = *pItemElem;
m_mChatLink.insert(make_pair(szInsert, pItem));


您将需要在析构函数中delete所有这些CItemElem

关于c++ - 我是否以正确的方式插入STL映射?它不会泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11377536/

10-09 06:30