【问题标题】:How to populate a vector<vector <Foo*> >?如何填充向量<vector <Foo*> >?
【发布时间】:2011-11-06 13:13:01
【问题描述】:

我有一个 RWLock 类,我正在尝试创建一个vector&lt;vector&lt;RWLock*&gt;&gt;,这是一个指向 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。我就是不知道是什么问题。

提前致谢。

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

【问题讨论】:

  • 为什么不board[i][j] = new RWLock();
  • 您是否在其他地方定义了j?你的内部循环应该使用j 而不是i
  • 第二个循环也应该超过宽度,而不是高度。 j 到底在哪里声明?

标签: c++ pointers stl vector


【解决方案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

【讨论】:

  • 谢谢,我对 C++ 的 OOP 部分很不满意。这似乎解决了我的问题。 i 和 j 只是我犯的一个愚蠢的错误,因为我必须手动复制代码。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-22
    • 2011-12-20
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多