如何填充矢量<矢量<Foo*> >?

How to populate a vector<vector <Foo*> >?

本文关键字:gt lt 矢量 Foo 何填充 填充      更新时间:2023-10-16

我有一个类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);"第二次,与I等于1。我就是想不出问题是什么。

提前感谢。

编辑:我不得不手工复制代码和内部循环(因为我在没有互联网连接的虚拟机中编写实际代码)是错误的。这里的代码现在与实际代码匹配。

除了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

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