C ++ утечка памяти с boost :: ptr_vector

При открытии диспетчера задач, чтобы увидеть использование памяти, он начнется с используемой памяти .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;
}

Спасибо за помощь.

0

Решение

Есть еще один большой кусок памяти, о котором вы, кажется, забыли: пространство, выделенное в vec держать указатели.

Это утверждение:

vec.clear();

deleteд все Tс, что вы создали с new, но это не освободило память, vec Сам выделен для хранения всех этих указателей. Если вы позвоните vec.capacity() вы увидите, что vec по-прежнему достаточно места для хранения как минимум 100000 T*,

Чтобы освободить эту память, используйте идиому подкачки:

boost::ptr_vector<T>().swap( vec );

Это создает временный ptr_vector который затем занимает vecвнутреннее хранилище в swap() вызов. Затем, когда временный уничтожен на ;, все хранилище освобождено.

1

Другие решения

Вы не можете полагаться на диспетчер задач Windows для использования памяти, по крайней мере, не так.

Вероятно, страницы памяти сохраняются, если вам нужно снова выделить память.

Попробуйте запустить то, что у вас в главном, в цикле for (создание vec + автоматическое уничтожение внутри цикла).
Если он продолжает расти, то у вас действительно может быть утечка памяти.

Но я сомневаюсь, что это произойдет, если вы неправильно используете boost :: ptr_vector.

2

Судя по всему, вы используете boost :: ptr_vector как следует.

Я предлагаю вам использовать Windows Perfmon, чтобы правильно определить использование памяти вашего приложения.
Увидеть этот блог для инструкций, как использовать Perfmon в Windows 7.

2
По вопросам рекламы [email protected]