Итак, мне нужна помощь. Я работаю над проектом на C++. Однако, я думаю, мне удалось каким-то образом развратить мою кучу. Это основано на том факте, что я добавил std::string
к классу и присвоив ему значение от другого std::string
:Управление памятью, повреждение кучи и C++
std::string hello = "Hello, world.\n";
/* exampleString = "Hello, world.\n" would work fine. */
exampleString = hello;
сбой в моей системе с дамп стека. Так что в основном мне нужно остановиться и пройти весь мой код и управление памятью и узнать, где я напортачил. Кодовая база по-прежнему небольшая (около 1000 строк), поэтому это легко сделать.
Все еще, я над головой с такими вещами, поэтому я думал, что выброшу его там. Я нахожусь в системе Linux и ткнул с помощью valgrind
, и, не зная полностью, что я делаю, он сообщил, что деструктор std::string
был недействительным бесплатным. Я должен признать, что термин «куча коррупции» относится к поиску Google; любые статьи общего назначения по этому типу материалов также будут оценены.
(В, прежде rm -rf ProjectDir
, сделать снова в C#: D)
EDIT: я не сделал это ясно, но то, что я прошу способы совета диагностики этого рода проблемы с памятью. Я знаю, что std :: string - это правильно, так что это то, что я сделал (или ошибка, но нет проблемы с выбором). Я уверен, что могу проверить код, который я написал, и вы очень умные люди увидели проблему в кратчайшие сроки, но я хочу добавить такой анализ кода в свой «набор инструментов».
+1, хороший список! Тем не менее, я бы оспаривал № 8 - хотя он предотвращает «плохие» обращения, это на самом деле запах кода, который скрывает плохую логику или плохое управление жизненным сроком объекта в моем опыте ... – Roddy 2010-03-15 15:46:40
В наши дни C++ имеет свои собственные интеллектуальные указатели в стандарте библиотеки, поэтому нет необходимости в Boost или Loki для этого. – 2015-12-21 15:41:03