Возникла ошибка. Отладочное утверждение не удалось _BLOCK_TYPE_IS_VALID при использовании удаления - PullRequest
0 голосов
/ 10 мая 2011

Я пытаюсь выполнить простой код на 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);
    }

Когда я удаляю second поле hash_map, я получаю 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 не выдаст ошибку .. и работает нормально?Какова действительная причина этой ошибки?

1 Ответ

6 голосов
/ 10 мая 2011

Вы выделили, используя 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 автоматически высвобождается при уничтожении объекта.

...