引发错误 调试断言失败 _BLOCK_TYPE_IS_VALID 使用删除时



我正在尝试C++的简单代码Debug Assertion Failed _BLOCK_TYPE_IS_VALID但是当我删除指针时出现错误。我不知道我做错了什么。这是我的代码。

hash_map<string,string> m_hashDetails;
    m_hashDetails.insert(hash_map<string,string>::value_type("test",*(new string("test123"))));

    hash_map<string,string>::iterator myIterator;
    myIterator = m_hashDetails.find("test");
    if(myIterator == m_hashDetails.end())
    {
        printf("not found");
    }
    else
    {
        printf(myIterator->second.c_str());
        //this is where I get Debug Assertion Failed _BLOCK_TYPE_IS_VALID
        delete &(myIterator->second);
    }

当我删除hash_mapsecond字段时Debug Assertion Failed _BLOCK_TYPE_IS_VALID出现错误。我做错了什么?我已使用运算符分配second字段new?我注意到的一件事是,如果我将hash_map定义更改为 hash_map<string,string *> m_hashDetails;并插入值,例如

m_hashDetails.insert(hash_map<string,string>::value_type("test",new string("test123")));

那么delete没有给出错误..并且工作正常?此错误的实际原因是什么?

您已使用 operator new 进行分配;但是您没有存储指向它的指针。相反,您正在存储分配的块;

int *p = new int(1); // ok, can be deleted later
int i = *new int(1); // memory leaked already, cannot delete as pointer is missed

此外,std::string不是指针类型,因此您无法delete它。

因此,在您的情况下,更改以下行,

*(new string("test123"))

string("test123")

然后你不必delete它,因为std::string在对象销毁时会自动释放。

相关内容

最新更新