`освобожденный указатель не был выделен` при использовании очереди stxxl

Мой код, кажется, работает (я не пробовал его с большими наборами данных из-за вышеуказанной ошибки).

Код:

#include <iostream>
#include <queue>
#include <stxxl/queue>

int main()
{
   //queue<int> q; //this works
   stxxl::queue<int> q; //does not work
   for (int i = 0; i<100; i++) {
       q.push(i);
   }
   std::cout << "done copying" << std::endl;
   while (q.empty() == false) {
       std::cout << q.front() << std::endl;
       q.pop();
   }
   std::cout << "done poping" << std::endl;
   return 0;
}

мой простой .stxxl это просто: disk=./testfile,0,syscall

Но моя ошибка:

stackexchangeexample(3884) malloc: *** error for object 0x101c04000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
The program has unexpectedly finished.

Я не уверен, как решить эту проблему, мне нужно освободить память в этом случае? Я все еще изучаю C++, так что извините, если это действительно просто (это происходит только тогда, когда я использую очередь stxxl).

1 ответ

Решение

Я никогда раньше не использовал stxxl, но так как это шаблон, вы можете взглянуть на код здесь: http://algo2.iti.kit.edu/stxxl/trunk/queue_8h_source.html. И так как вы новичок, я объясню несколько вещей. Эта тупая очередь поддерживает очередь указателей. Строка 00054 показывает typedef ValTp value_typeтак что теперь ваш int это value_type, 00072 и 00073 линии показывают, что ваши передние и задние элементы value_type, Вы видите, как они будут поддерживаться как указатели. Наконец, если вы посмотрите на любой конструктор pool_type* pool определенное в строке 00069 будет "new'd" вверх (который является основой ваших элементов) и init функция всегда вызывается. А внутри init, pool->steal() называется, нажмите на него, если вы хотите узнать больше.

Короче говоря, вам нужно помещать новые целые числа в вашу очередь. Плохой интерфейс, а не ваша вина.

Другие вопросы по тегам