昨天有人给了我一个错误的程序。在MVS 2010中工作,我发现了问题,也是它的替代方案。问题是重载的插入操作符类。它的原型如下......
void matrix :: operator << (matrix&) ;
这是从这样的地方打来的......
matrix m ;
m.operator << (m) ;
我发现编译器不允许将相同的对象作为调用函数的引用参数发送。但我不明白背后的原因以及它创造了什么问题。如果有人能够解释,我将不胜感激。 感谢。
修改
实际发生的是,在调试时,它进入函数内部,在执行main
时出现,进入外部依赖文件dbgdel.cpp
并在此行停止。
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
答案 0 :(得分:5)
给出的代码在VS2010 SP1
中编译并运行得很好。
如图所示,代码也没有问题,这是完全合法的。声明运算符重载然后使用运算符<<
调用它有点奇怪,因为您可以轻松地编写m << m
。
一些猜测:
m
的地址并意外删除答案 1 :(得分:1)
在实施operator <<
的方法中,请务必检查自引用:
void matrix :: operator << (matrix& other)
{
if (this == &other)
{
/* special processing */
}
else
{
/* regular code */
}
}
答案 2 :(得分:1)
好像你的程序告诉你堆已经损坏:在某些时候它已经超过了数组的边界或者通过一个被释放的指针写入内存,或类似的东西。
这些错误可能难以追踪,因为您不确切知道它何时发生,但它很可能发生在错误出现的不同位置。以您的方式使用参考参数没有问题。
这里有一堆关于如何检测堆损坏的建议: