2012-05-13 2 views
4

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

Код:

#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).

+0

Вы удаляли предыдущие версии этого вопроса и отправляли его повторно? Я уверен, что видел это несколько раз сегодня. – Blastfurnace

+0

@Blastfurnace да извините. Я сделал это сегодня, так как кто-то отправил комментарий (в прошлый раз мне посоветовали решить другое предупреждение, которое я получал, поэтому я удалил вопрос, изучая, как настроить. Stxxl). Если я могу решить это сам (или указал на правильное направление), я не хотел тратить время, чтобы прочитать его. – Lostsoul

+0

Вы можете отредактировать свой вопрос, а не удалить его, и перепрограммировать измененную версию. – luke

ответ

1

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

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

+0

Wow..thanks так много, я буду изучать код больше и понять больше. Спасибо, что потратили время на объяснение. Я подумал, может быть, я не использовал malloc/free или что-то еще. – Lostsoul

+0

Еще раз спасибо jnbbender. Я попытался прочитать весь их исходный код, чтобы понять, но я смущен тем, что мне нужно сделать, чтобы заставить его работать. Что это означает, чтобы выталкивать целые числа «new'd up»? – Lostsoul

+0

, когда вы говорите что-то «новое», это означает, что вы использовали 'new' для распределения памяти для него, другими словами« Integer myInt = new Integer ». Здесь я' new'd' вверх ' Integer'. Pushing ссылается на то, что они поместили их всех в свой список, возможно, нажатие не то, что я должен был сказать, но все, что я имел в виду, это то, что они помещают их в свой список. Поэтому, чтобы заставить его работать: 'int p [] = {12, 34, 56}; q.push (p + i); 'Или' int * p1 = new int (12); q.push (р1); int * p2 = new int (34); q.push (p2); 'Вам нужно нажимать указатели. – jiveturkey