2011-11-06 113 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并且它应该起作用。 :)

相关问题