首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何填充vector<vector <Foo*> >?

如何填充vector<vector <Foo*> >?
EN

Stack Overflow用户
提问于 2011-11-06 21:13:02
回答 2查看 301关注 0票数 0

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

代码语言:javascript
复制
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;
    }
}

然而,当我运行这段代码时,我得到

代码语言:javascript
复制
*** glibc detected*** ./test: free(): invalid pointer: 0x[some hexa] ***

我已经对此进行了足够的调试,知道当我第二次调用"boardi = vector (width,NULL);“时,它就会弹出,其中i等于1。我只是不知道问题是什么。

提前谢谢。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-06 21:30:54

除了Topi Ojala担心你的vairable i被重用,以及j没有被声明之外,你还有一个问题:

代码语言:javascript
复制
    lock = (RWLock*) malloc(sizeof(RWLock*));
    *lock = RWLock();
    board[i][j] = lock;

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

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

只需使用new即可:

代码语言:javascript
复制
   lock = new RWLock;
   board[i][j] = lock;

或者,如果您确实希望使用malloc进行分配,请使用placement new

票数 3
EN

Stack Overflow用户

发布于 2011-11-06 21:19:15

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8027200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档