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

标签 c++ object pointers dictionary insert

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

相关文章:

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

python - 获取 __init__ 变量

javascript - 如何迭代对象文字数组以查找匹配的属性?

C++:无法使用类型为 'char**' 的右值初始化类型为 'char*[x]' 的变量

C char * 赋值

java - C++ 模板的 Java 等价物是什么?

c++ - 关于 Poco C++ 的任何好的(非常好的) Material ?

c++ - Qt SSl 错误 (QSslSocket : cannot resolve TLSv1_1_client_method)

java - 为什么 Object.clone() 在 Java 中是原生的?

c - 我释放节点的方式是否正确?