Освободить память о std :: vector C ++ - PullRequest
2 голосов
/ 29 сентября 2011

У меня есть вектор, как показано ниже.

std::vector<std::string> exportNameList;

Я добавляю элементы к этому с помощью метода push_back. Но я получаю отладочное утверждение как "

"Windows запустила точку останова в AxCent.exe. Это может быть связано с повреждением кучи, что указывает на ошибку в AxCent.exe или любой из загруженных ею библиотек DLL.

Это происходит, когда вызывается деструктор класса. Когда я ссылаюсь на стек вызовов, меня перенаправляют на следующий блок кода в классе векторов.

~vector()
{   // destroy the object
    _Tidy();
}

Я заметил, что при удалении вектора произошла ошибка. Я прав? Как это исправить? Я привел много примеров, но пока не смог разобраться. Я совсем новичок в C ++.

Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 29 сентября 2011

Возможно, вы повреждаете память, используемую вектором где-то еще.

1 голос
/ 29 сентября 2011

Ошибка, с которой вы сталкиваетесь, может не иметь прямого отношения к вашему вектору.Если память (куча) повреждена до вызова деструктора вашего вектора, то менеджер кучи может только обнаружить повреждение в это время (освобождая структуру, динамически выделяемую вектором или динамически размещаемыми строками внутри).

На мой взгляд, лучший способ устранения подобных ошибок на платформе Windows - активировать полную страницу кучи для вашей программы.

Вы можете сделать это двумя способами:

  • либо используя gflags, содержащиеся в «Средствах отладки для Windows».Запустите его как администратор, перейдите на вкладку «Файл изображения», введите имя вашего EXE-файла в поле «Изображение» (AxCent.exe), нажмите TAB, отметьте «Включить кучу страниц» и нажмите «Применить»
  • или используйте Application Verifier.Выберите исполняемый файл в меню приложения «Файл / приложение», установите флажок «Основные / куча» и нажмите «Сохранить».

Этот параметр будет применяться при каждом запуске этого приложения.

Затем запустите приложение под отладчиком (WindDbg или Visual Studio).Если память была повреждена до удаления вектора, в этот момент отладчик должен прекратить работу.

Когда вы закончите отслеживать ошибку, не забудьте отключить Full Page Heap.

...