gpt4 book ai didi

C++ 当使用 insert() 将堆对象插入 std::map 并且存在另一个对象时,谁删除了新对象?

转载 作者:行者123 更新时间:2023-11-27 23:08:51 29 4
gpt4 key购买 nike

当我需要使用此方法插入多个值时,我试图(以某种方式)在 std::map 上缓存多个迭代:

enum PROPERTY_TYPE
{
TYPE_BOOLEAN,
TYPE_INTEGER,
TYPE_UNSIGNED,
TYPE_FLOAT,
TYPE_STRING
};
struct Property {
Property(PROPERTY_TYPE type)
: type(type), bool_val(false), integer_val(0), unsigned_val(0), float_val(0.0f), string_val("")
{ }
PROPERTY_TYPE type;
bool bool_val;
int integer_val;
unsigned int unsigned_val;
float float_val;
std::string string_val;
};
std::map< std::string, Property* > _Properties;

void pushBool(std::string key, bool value)
{
std::pair< std::map< std::string, Property* >::iterator, bool > pItr;
pItr = _Properties.insert( std::pair< std::string, Property* >(key, new Property(TYPE_BOOLEAN)) );
// If the value doesn't exist then it's created automatically or the existion one is used.
pItr.first->second->bool_val = value;
pItr.first->second->integer_val = value ? 1 : 0;
pItr.first->second->unsigned_val = value ? 1 : 0;
pItr.first->second->float_val = value ? 1.0f : 0.0f;
pItr.first->second->string_val = value ? "true" : "false";
}

这是目前为止我能让它工作的最快、最安全的方法。但是我对一件小事感兴趣,那就是 insert() 函数。当我调用 new Property(TYPE_BOOLEAN) 时,我显然创建了一个没有人控制的 new Property() 。从我读到的内容来看,std::map 在丢弃时不会对指针调用 delete。当我使用这种插入方法时,插入函数使用现有值(如果它已经存在)。那么,如果一个值已经存在并且使用它而不是新值,谁会删除新创建的 Property() 呢?

    pItr = _Properties.insert( std::pair< std::string, Property* >(key, new Property(TYPE_BOOLEAN)) );

这种方法会不会因为引入内存泄漏而浪费内存?

最佳答案

是的,那条线会导致泄漏。

要么存储智能指针,要么在插入前检查是否存在。我会建议智能指针。 unique_ptr 可能用于指示所有权。

在这种特殊情况下,免费商店分配不是一个好主意,但我认为真正的问题是有理由在那里存放元素。

关于C++ 当使用 insert() 将堆对象插入 std::map 并且存在另一个对象时,谁删除了新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21499458/

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