Как заполнить вектор>? - PullRequest
0 голосов
/ 06 ноября 2011

У меня есть класс 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] ***

Я отладил это достаточно, чтобы знать, что это всплывает, как только яcall "board [i] = vector (width, NULL);"во второй раз, когда я равняюсь 1. Я просто не могу понять, в чем проблема.

Заранее спасибо.

РЕДАКТИРОВАТЬ: мне пришлось скопировать код вручную ивнутренний цикл (потому что я пишу реальный код на виртуальной машине без подключения к интернету) был неправильным.Код здесь теперь соответствует фактическому коду.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2011

В дополнение к озабоченности Топи Охала по поводу повторного использования вашего i и j не объявленного, у вас есть проблема здесь:

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

вы выделяете пространство для RWLock, но никогда не создаете RWLock.

Затем вы во второй строке создаете временный RwLock() и вызываете оператор присваивания первого RWLock, который на самом деле не является RWLock, потому что, как упоминалось выше, он еще не был создан. Подобный вызов оператора присваивания приведет к неопределенному поведению.

просто используйте вместо этого новый:

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

или, если вы действительно хотите выделить с помощью malloc, используйте Place New

1 голос
/ 06 ноября 2011

Вы используете ту же самую переменную for-loop i в ваших циклах. Измените переменную внутреннего цикла на j , и она должна работать. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...