Кто-то дал мне программу с ошибкой вчера. Работая в MVS 2010, я нашел проблему и альтернативу для нее. Проблема была в перегруженном операторе вставки класса. Его прототип был следующим …
void matrix :: operator << (matrix&) ;
Он был вызван откуда-то, как это …
matrix m ;
m.operator << (m) ;
Я выяснил, что компилятор не позволяет отправлять тот же объект, что и ссылочный параметр, для которого была вызвана функция. Но я не понимаю причину этого и то, что проблема создает. Буду признателен, если кто-нибудь сможет это объяснить.
Благодарю.
РЕДАКТИРОВАТЬ:
На самом деле происходит то, что при отладке он входит в функцию, выходит и при выполнении main
, переходит во внешний файл зависимостей dbgdel.cpp
и останавливается на этой линии.
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
Данный код компилируется и прекрасно работает в VS2010 SP1
,
Там нет проблем с кодом, как показано, это совершенно законно. Я немного странно объявить перегрузку оператора, а затем вызвать его с оператором <<
так же легко можно написать m << m
,
Некоторые догадки:
m
где-то в реализации оператора и случайно удалив его Похоже, ваша программа сообщает вам, что куча повреждена: в какой-то момент она перешла границы массива или записана в память через освобожденный указатель или что-то в этом роде.
Эти ошибки могут быть трудно отследить, так как вы точно не знаете, когда это произошло, но очень вероятно, что это произошло в другом месте, где обнаружилась ошибка. Нет проблем с использованием эталонных параметров, как у вас.
Есть несколько предложений по обнаружению повреждения кучи:
В способе реализации operator <<
не забудьте проверить для самостоятельной ссылки:
void matrix :: operator << (matrix& other)
{
if (this == &other)
{
/* special processing */
}
else
{
/* regular code */
}
}