Передача объекта перегруженному оператору

Кто-то дал мне программу с ошибкой вчера. Работая в MVS 2010, я нашел проблему и альтернативу для нее. Проблема была в перегруженном операторе вставки класса. Его прототип был следующим …

void matrix :: operator << (matrix&) ;

Он был вызван откуда-то, как это …

matrix m ;
m.operator << (m) ;

Я выяснил, что компилятор не позволяет отправлять тот же объект, что и ссылочный параметр, для которого была вызвана функция. Но я не понимаю причину этого и то, что проблема создает. Буду признателен, если кто-нибудь сможет это объяснить.
Благодарю.

РЕДАКТИРОВАТЬ:
На самом деле происходит то, что при отладке он входит в функцию, выходит и при выполнении main, переходит во внешний файл зависимостей dbgdel.cpp и останавливается на этой линии.

 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

7

Решение

Данный код компилируется и прекрасно работает в VS2010 SP1,

Там нет проблем с кодом, как показано, это совершенно законно. Я немного странно объявить перегрузку оператора, а затем вызвать его с оператором <<так же легко можно написать m << m,

Некоторые догадки:

  • Вы берете адрес m где-то в реализации оператора и случайно удалив его
  • Вы пересекаете границы массива значений, который, вероятно, хранится в матрице внутри реализации оператора.
  • Существует несоответствие в предположениях компилятора и компоновщика между вызывающим кодом и вызываемым кодом. Проверьте ваши соглашения о вызовах, версии библиотек времени выполнения с обеих сторон и любые другие параметры, такие как SECURE_SCL и отладка интегратора.
5

Другие решения

Похоже, ваша программа сообщает вам, что куча повреждена: в какой-то момент она перешла границы массива или записана в память через освобожденный указатель или что-то в этом роде.

Эти ошибки могут быть трудно отследить, так как вы точно не знаете, когда это произошло, но очень вероятно, что это произошло в другом месте, где обнаружилась ошибка. Нет проблем с использованием эталонных параметров, как у вас.

Есть несколько предложений по обнаружению повреждения кучи:

Повреждение кучи под Win32; как найти?

1

В способе реализации operator << не забудьте проверить для самостоятельной ссылки:

void matrix :: operator << (matrix& other)
{
if (this == &other)
{
/* special processing */
}
else
{
/* regular code */
}
}
1
По вопросам рекламы [email protected]