2011-11-06 153 views
0

我有一個類RWLock,我試圖創建一個vector<vector<RWLock*>>,指向RWLock的二維向量。 我在做什麼是:如何填充矢量<矢量<Foo*>>?

vector<vector <RWLock*>> board = vector<vector <RWLock*>>(height); 
RWLock* lock; 
for(int i = 0 ; i < height ; ++i) 
{ 
    board[i] = vector <RWLock*>(width, NULL); 
    for(int j = 0 ; j < width ; ++j) 
    { 
     lock = (RWLock*) malloc(sizeof(RWLock*)); 
     *lock = RWLock(); 
     board[i][j] = lock; 
    } 
} 

當我運行這一點,但是,我得到

*** glibc detected*** ./test: free(): invalid pointer: 0x[some hexa] *** 

我已經調試這足以知道,這個只要我打電話彈出「板[i] = vector(width,NULL);「第二次,我等於1.我只是無法弄清楚問題所在。

在此先感謝。

編輯:我不得不手動複製代碼和內部循環(因爲我在沒有互聯網連接的虛擬機中寫入實際代碼)是錯誤的。這裏的代碼現在匹配實際的代碼。

+2

爲什麼不'板分配[i] [j] =新rwlock中(); '? –

+0

你有在別處定義的'j'嗎?你的內循環應該使用'j'而不是'i'。 – Jacob

+0

第二圈也應該是寬度,而不是高度。 j在哪裏宣佈呢? – 2011-11-06 13:21:40

回答

3

除了託皮奧亞拉的有關vairable 被重新使用的關注,並Ĵ未聲明的,你這裏有一個問題:

lock = (RWLock*) malloc(sizeof(RWLock*)); 
    *lock = RWLock(); 
    board[i][j] = lock; 

你分配的空間一個RWLock,但從來沒有構建RWLock。

然後,您在第二行構建一個臨時RwLock(),並調用第一個RWLock的賦值運算符,該運算符實際上不是RWLock,因爲如上所述,它尚未構建。像這樣調用賦值運算符會導致未定義的行爲。

只是用新的來代替:

lock = new RWLock; 
    board[i][j] = lock; 

,或者,如果你真的想使用malloc,利用安置新

+0

謝謝,我對C++的OOP部分非常生疏。這似乎解決了我的問題。 我和j的東西只是我犯的一個愚蠢的錯誤,因爲我不得不手工複製代碼。 –

1

您正在循環中使用相同的循環變量i。將內循環變量更改爲j並且它應該起作用。 :)