将对象传递给重载运算符

时间:2012-09-12 14:46:55

标签: c++ oop operator-overloading runtime-error insertion

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

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

这是从这样的地方打来的......

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

我发现编译器不允许将相同的对象作为调用函数的引用参数发送。但我不明白背后的原因以及它创造了什么问题。如果有人能够解释,我将不胜感激。 感谢。

修改 实际发生的是,在调试时,它进入函数内部,在执行main时出现,进入外部依赖文件dbgdel.cpp并在此行停止。

 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

3 个答案:

答案 0 :(得分:5)

给出的代码在VS2010 SP1中编译并运行得很好。

如图所示,代码也没有问题,这是完全合法的。声明运算符重载然后使用运算符<<调用它有点奇怪,因为您可以轻松地编写m << m

一些猜测:

  • 您正在操作员实施中的某处获取m的地址并意外删除
  • 您正在超出可能存储在矩阵中的值数组的边界,在运算符实现中。
  • 调用代码和被调用代码之间的编译器和链接器假设不匹配。检查您的调用约定,双方运行时库的版本以及SECURE_SCL和interator调试等任何其他设置。

答案 1 :(得分:1)

在实施operator <<的方法中,请务必检查自引用:

void matrix :: operator << (matrix& other) 
{
  if (this == &other) 
  {
    /* special processing */
  }
 else
  {
    /* regular code */
  }
}

答案 2 :(得分:1)

好像你的程序告诉你堆已经损坏:在某些时候它已经超过了数组的边界或者通过一个被释放的指针写入内存,或类似的东西。

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

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

Heap corruption under Win32; how to locate?