[問題] 不知道怎麼發生的記憶體錯誤

作者: 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