gpt4 book ai didi

c++ - 我是否以正确的方式插入到 STL map 中?它不会泄漏内存吗?

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:22 25 4
gpt4 key购买 nike

以下代码是否 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_mChatLinkstd::map<std::string, CItemElem> (不是 CItemElem* )或者这个:

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

您需要 delete所有这些CItemElem s 在你的析构函数中。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com