Рассмотрим этого кода:штормовых указатели кучи хранятся в станде :: очередь
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: кажется, происходит только тогда, когда процесс отлаживается. На самом деле это не проблема на самом деле. Тем не менее, странно.
Вы не можете использовать auto_ptr? или Если у вас есть свобода использования boost, используйте boost :: tr1 :: shared_ptr. –
ha9u63ar
@hagubear: Или, если у вас есть свобода использовать современную библиотеку, 'std :: unique_ptr' –
вы избили меня в этом @MikeSeymour :) Я пересек палец и предположил, что он/она все еще находится в 4.8.1 , auto_ptr устарел и заменен на unique_ptr в C++ 11 и далее – ha9u63ar