2010-04-02 44 views
2

在代碼:廣東話可用內存

template<class T,int row, int col> 
void invert(T (&a)[row][col]) 
{ 
T* columns = new T[col * row]; 
T* const free_me = columns; 
T** addresses = new T*[col * row]; 
T** const free_me_1 = addresses; 
/*cpy addresses*/ 
for (int i = 0; i < row; ++i) 
{ 
    for (int j = 0; j < col; ++j) 
    { 
     *addresses = &a[i][j]; 
     ++addresses; 
    } 
} 
addresses = free_me_1; 
/*cpy every column*/ 
for (int i = 0; i < col; ++i) 
{ 
    for (int j = 0; j < row; ++j) 
    { 
     *columns = a[j][i]; 
     ++columns; 
    } 
} 
columns = free_me; 
/*cpy from columns to addresses*/ 
for (int i = 0; i < (col * row); ++i) 
{ 
    *addresses[i] = columns[i]; 
} 

delete[] free_me_1; 
delete[] free_me; 
} 

我觀察到,儘管迭代,變量列的值爲零,我認爲這就是問題。
感謝您的幫助。

P.S.我粘貼了這個fnc的最終版本。它現在按預期工作。感謝大家的寶貴幫助。

+0

你是怎麼調用這個函數的? – 2010-04-02 09:48:59

+0

嗨,尼爾,我給我的帖子添加了對我的fnc的電話。 – 2010-04-02 09:50:20

+0

您可能想要通過引用來獲取數組,以便可以自動且正確地推導出所有模板參數:'T(&a)[row] [col]' - 否則您必須至少指定參數T和行,我認爲。 – sellibitze 2010-04-02 09:56:22

回答

3

因爲緩衝區太小,所以您寫過緩衝區末端。

T* columns = new T[col]; 

應該

T* columns = new T[col*row]; 

Writine了緩衝區到底是不確定的行爲 - 你的情況是堆損壞,因爲你覆蓋了堆功能所必需的一些業務數據等delete[]失敗。

+0

但是在什麼時候? – 2010-04-02 09:51:34

+0

謝謝,當然,我很害怕eejit。我會在10分鐘內接受你的回答; – 2010-04-02 09:52:34

0

您將columns初始化爲new T[col]。然後你增加內循環中的列,得到執行列*行時間 - 除非rows==1,你增加列超過你分配的數組的末尾,導致未定義的行爲。


請注意,即使一旦您解決這個問題,您的功能仍然是非常錯誤的 - 它既沒有返回值也沒有副作用。它應該是沒有操作的。它絕對不會顛倒它的參數。

+0

是的,我知道,這實際上只是這個fnc的一部分; – 2010-04-02 10:17:56