При открытии диспетчера задач, чтобы увидеть использование памяти, он начнется с используемой памяти .3 МБ. После добавления 100 000 объектов в ptr_vector используется 2,3 МБ памяти. После использования .clear () для вектора, память уходит в .8-.9MB. Какова причина этого увеличенного использования памяти?
Вот код:
#include <iostream>
#include <boost/ptr_container/ptr_vector.hpp>
class T {
public:
static int nObjects;
T() {
nObjects++;
}
~T(){
nObjects--;
}
};
int T:: nObjects = 0;
int main() {
boost::ptr_vector<T> vec;
char pause;
std::cout << "Press any key to continue: ";
std::cin >> pause;
for(int i=0; i<100000; i++) {
vec.push_back(new T);
}
std::cout << T::nObjects << " objects created." << std::endl;
std::cout << "Press any key to continue: ";
std::cin >> pause;
vec.clear();
std::cout << T::nObjects << std::endl;
std::cout << "Press any key to exit: ";
std::cin >> pause;
return 0;
}
Спасибо за помощь.
Есть еще один большой кусок памяти, о котором вы, кажется, забыли: пространство, выделенное в vec
держать указатели.
Это утверждение:
vec.clear();
delete
д все T
с, что вы создали с new
, но это не освободило память, vec
Сам выделен для хранения всех этих указателей. Если вы позвоните vec.capacity()
вы увидите, что vec
по-прежнему достаточно места для хранения как минимум 100000 T*
,
Чтобы освободить эту память, используйте идиому подкачки:
boost::ptr_vector<T>().swap( vec );
Это создает временный ptr_vector
который затем занимает vec
внутреннее хранилище в swap()
вызов. Затем, когда временный уничтожен на ;
, все хранилище освобождено.
Вы не можете полагаться на диспетчер задач Windows для использования памяти, по крайней мере, не так.
Вероятно, страницы памяти сохраняются, если вам нужно снова выделить память.
Попробуйте запустить то, что у вас в главном, в цикле for (создание vec + автоматическое уничтожение внутри цикла).
Если он продолжает расти, то у вас действительно может быть утечка памяти.
Но я сомневаюсь, что это произойдет, если вы неправильно используете boost :: ptr_vector.
Судя по всему, вы используете boost :: ptr_vector как следует.
Я предлагаю вам использовать Windows Perfmon, чтобы правильно определить использование памяти вашего приложения.
Увидеть этот блог для инструкций, как использовать Perfmon в Windows 7.