如何填充向量<vector <foo * =“”>&gt;?</vector>

时间:2011-11-06 13:13:02

标签: c++ pointers stl vector

我有一个类RWLock,我正在尝试创建一个vector<vector<RWLock*>>,一个指向RWLock的指针的二维向量。 我正在做的是:

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] ***

我已经调试了这个,知道一旦我调用“board [i] = vector(width,NULL)”就会弹出这个;“第二次,我等于1.我只是无法弄清问题是什么。

提前致谢。

编辑:我必须手动复制代码和内部循环(因为我在没有互联网连接的VM中写入实际代码)是错误的。这里的代码现在与实际代码匹配。

2 个答案:

答案 0 :(得分:3)

除了Topi Ojala对您的可修复 i 被重用以及 j 未被宣布的担忧之外,您还有一个问题:

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

您正在为RWLock分配空间,但从不构建RWLock。

然后你在第二行构建一个临时RwLock(),并调用第一个RWLock的赋值运算符,它实际上不是一个RWLock,因为如上所述,它还没有被构造。像这样调用赋值运算符将导致未定义的行为。

只需使用new:

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

或者,如果你真的想用malloc分配,请使用placement new

答案 1 :(得分:1)

您在循环中使用相同的for循环变量 i 。将内循环变量更改为 j ,它应该可以工作。 :)