Управления памятью, повреждения кучи и C ++ - PullRequest
17 голосов
/ 11 августа 2008

Итак, мне нужна помощь. Я работаю над проектом на C ++. Тем не менее, я думаю, что мне как-то удалось испортить мою кучу. Это основано на том факте, что я добавил std::string к классу и присвоил ему значение из другого std::string:

std::string hello = "Hello, world.\n";
/* exampleString = "Hello, world.\n" would work fine. */
exampleString = hello;

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

Тем не менее, я нахожусь над моей головой с такими вещами, поэтому я подумал, что я выброшу это там. Я нахожусь в системе Linux и ковыряюсь с valgrind, и, хотя и не зная полностью, что я делаю, он действительно сообщил, что деструктор std::string был недействительным free. Я должен признать, что термин «повреждение кучи» используется в поиске Google; любые статьи общего назначения о подобных вещах также приветствуются.

(до rm -rf ProjectDir, повторить в C #: D)

EDIT: Я не дал понять, но я спрашиваю, каким образом можно диагностировать подобные проблемы с памятью. Я знаю, что с std :: string все правильно, так что это то, что я сделал (или ошибка, но проблемы с выбором нет). Я уверен, что смогу проверить написанный мной код, и вы, очень умные люди, сразу увидите проблему, но я хочу добавить этот вид анализа кода к моей «панели инструментов».

Ответы [ 12 ]

1 голос
/ 11 августа 2008

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

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

0 голосов
/ 11 августа 2008

Насколько я могу судить, ваш код правильный. Предполагая, что exampleString является std :: string, которая имеет область видимости класса, как вы описали, вы должны иметь возможность инициализировать / назначить ее таким образом. Возможно, есть какая-то другая проблема? Возможно, фрагмент реального кода поможет поместить его в контекст.

Вопрос: является ли exampleString указателем на строковый объект, созданный с помощью new?

...