当我需要使用此方法插入多个值时,我试图(以某种方式)在 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/