以下代码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/