[问题] 不知道怎么发生的内存错误

楼主: PhysiAndMath (老师说要爱数学)   2014-09-27 06:39:00
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux icc 以及 windows code::block
问题(Question):
我自己写了个class
主要是想方便我自己做矩阵运算
但不知道为什么总是会发生类似内存错误的状况
自己用code::block跑debuger后总是发生在 delete [] _value这里
对于问题发生的原因完全没有头绪
所以来这里寻求帮助
错误结果(Wrong Output):
在windows跑会跳出 [档名] 已经停止运作的资讯
在linux icc编译后执行会出现
*** glibc detected *** free(): invalid next size (fact)
程式码(Code):(请善用置底文网页, 记得排版)
http://codepad.org/Yb92x0KV
补充说明(Supplement):
这是我第一次写class,一边看着c++ Primer 中文版 3rd 一边写的。
我想表达的意思是我现在还刚在学着写class,希望前辈们提点的详细点。
我完全不知道问题是怎么一回事,所以我将全部的程式码写上去,
原始码稍长,为方便各位快速的理解我想做的事情,我简单的介绍一下我的程式。
我在研究所的领域需要做一些数值计算,会频繁的用到矩阵运算,
对于程式语言也只有在大学修过一个学期的C++,而C++对于阵列的运算不那么的友善,
所以我想建立一个class来支援。
一个矩阵的基本资讯包含了矩阵的行数与列数,我用_row和_col代表。
矩阵内的元素用一个一维的阵列去装,叫做_value。
我希望在程式撰写的时候能够让我直观的看懂我自己写了什么,所以我重载了()和[]
用()代表两个下标,用[]代表一个下标。
(写到这里才到也许我可以做这件事情 operator[](int,int) 代表两个下标)
这样我就可以用a(i,j)代表矩阵a的第i,j个元素,b[i]代表向量b的第i个元素。
指派运算子的重载用的是传入一个ref to object然后复制其内容。
在重载加法运算子的时候我想到另外一个问题,也希望前辈们能顺便替我解答。
如果我用pass by value的方式回传加法的结果然后被指派运算子用pass by reference
的方式接受。那么该object会活到什么时候?
我暂时解决这个问题的方式是造一个static class object让所有的运算结果占存在里面。
因为他是static所以我可以让所有的运算都用pass by reference传回结果。
也因为他是一个所有该class object都会去使用的地方,所以我叫他_park。
我想我的程式需要解释的大概就这样。
先谢谢前辈们的帮助了。
作者: scwg ( )   2014-09-27 11:16:00
operator()(int i,int j)里_value[i*_row+j]应该是i*_col+j另外(不相关,但值得修正) operator() 和 [] 的boundry check应该是 >= _row / >= _col / >= _col * _row
楼主: PhysiAndMath (老师说要爱数学)   2014-09-27 11:48:00
哦!所以我有可能在做乘法的时候不小心跑出边界了,以至于内存错误!谢谢

Links booklink

Contact Us: admin [ a t ] ucptt.com