7

昨天有人给了我一个错误的程序。在 MVS 2010 中工作时,我也发现了问题和替代方法。问题是类的重载插入运算符。它的原型如下...

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

它是从这样的地方调用的......

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

我发现编译器不允许发送与调用函数的引用参数相同的对象。但我不明白这背后的原因以及它会产生什么问题。如果有人能解释一下,我将不胜感激。谢谢。

编辑: 实际发生的是,在调试时,它进入函数内部,出来并在执行时main,进入外部依赖文件dbgdel.cpp并停在这一行。

 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
4

3 回答 3

5

给出的代码在VS2010 SP1.

如图所示,代码也没有问题,完全合法。声明一个运算符重载然后用 operator 调用它有点奇怪<<,就像你可以很容易地写一样m << m

一些猜测:

  • 您正在获取m操作员实现中某处的地址并意外删除它
  • 您超出了运算符实现内部可能存储在矩阵中的值数组的边界。
  • 调用代码和被调用代码之间的编译器和链接器假设不匹配。检查您的调用约定、双方的运行时库版本以及任何其他设置,例如 SECURE_SCL 和 interator 调试。
于 2012-09-14T14:58:11.423 回答
1

在实现方法中operator <<确保检查自引用:

void matrix :: operator << (matrix& other) 
{
  if (this == &other) 
  {
    /* special processing */
  }
 else
  {
    /* regular code */
  }
}
于 2012-09-12T15:00:31.320 回答
1

似乎您的程序告诉您堆已损坏:在某些时候它已经超出了数组的边界或通过已释放的指针或类似的东西写入内存。

这些错误很难追踪,因为您不知道它发生的确切时间,但很可能它发生在与错误出现的不同的地方。以您的方式使用参考参数没有问题。

这里有很多关于如何检测堆损坏的建议:

Win32下的堆损坏;如何定位?

于 2012-09-16T07:56:45.037 回答