2014-11-04 5 views
4

Рассмотрим этого кода:штормовых указатели кучи хранятся в станде :: очередь

class Foo; 

std:queue<Foo*> q; 

// allocate and add objects to the queue 
for (int i=0; i<100000; i++) 
{ 
    Foo* f = new Foo(); 
    q.push(f); 
} 

// remove objects from queue and free them 
while (!q.empty()) 
{ 
    Foo* f2 = q.front(); 
    q.pop(); 
    delete f2; 
} 

По пошаговому я могу видеть, деструктор Foo вызывался как каждый объект будет удален, так что я бы ожидать, что использование памяти процесса в когда каждый из них удаляется, но это не так. В моем приложении очередь используется в потоках производителей/потребителей, и использование памяти просто продолжает расти.

Единственный способ, которым я нашел, чтобы восстановить память, чтобы поменять местами в очереди для пустого всякий раз, когда я хлопнутой все элементы из него:

q.swap(std::queue<Foo*>()); 

Если я использую вектор, а не очереди, удаление сохраненные объекты сразу же теряют использование памяти процесса. Может ли кто-нибудь объяснить, почему очередь не ведет себя так?

Изменить, чтобы уточнить из комментариев: Я понимаю, что очередь управляет памятью указатель сами (то есть 4 или 8 байт на указатель) переменных, и что я не могу контролировать, когда что памяти освобождается , Что меня беспокоит, так это то, что указана память кучи, которую I управляет через новые и удаляет, также не выпускается вовремя.

* Редактировать 2: кажется, происходит только тогда, когда процесс отлаживается. На самом деле это не проблема на самом деле. Тем не менее, странно.

+0

Вы не можете использовать auto_ptr ? или Если у вас есть свобода использования boost, используйте boost :: tr1 :: shared_ptr. – ha9u63ar

+2

@hagubear: Или, если у вас есть свобода использовать современную библиотеку, 'std :: unique_ptr' –

+0

вы избили меня в этом @MikeSeymour :) Я пересек палец и предположил, что он/она все еще находится в 4.8.1 , auto_ptr устарел и заменен на unique_ptr в C++ 11 и далее – ha9u63ar

ответ

0

Многие реализации delete/free не всегда могут вернуть всю оперативную память в операционную систему сразу - память может быть доступна для этого процесса некоторое время. Поэтому, если вы измеряете свой RSS или что-то еще, вы не можете ожидать, что он спустится в тот момент, когда что-то будет удалено. Я думаю, что поведение может быть различным в режиме отладки, что объясняет, что вы видите.

Смежные вопросы