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

看板C_and_CPP作者 (老師說要愛數學)時間11年前 (2014/09/27 06:39), 編輯推噓0(006)
留言6則, 2人參與, 最新討論串1/1
開發平台(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。 我想我的程式需要解釋的大概就這樣。 先謝謝前輩們的幫助了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.184.66 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1411771144.A.8D0.html

09/27 11:16, , 1F
operator()(int i,int j)裏_value[i*_row+j]應該是i*_col+j
09/27 11:16, 1F

09/27 11:17, , 2F
另外(不相關,但值得修正) operator() 和 [] 的boundry check
09/27 11:17, 2F

09/27 11:18, , 3F
應該是 >= _row / >= _col / >= _col * _row
09/27 11:18, 3F

09/27 11:48, , 4F
哦!所以我有可能在做乘法的時候不小心跑出邊界了
09/27 11:48, 4F

09/27 11:48, , 5F
,以至於記憶體錯誤!
09/27 11:48, 5F

09/27 11:48, , 6F
謝謝
09/27 11:48, 6F
文章代碼(AID): #1K9Ui8ZG (C_and_CPP)