Вектор C ++ STL использует слишком много памяти - PullRequest
1 голос
/ 07 ноября 2011

Я пишу программу, которая использует vector как vector<Myclass* > Длина этого вектора составляет около 1000, и я использую цикл for, чтобы продолжать вставлять около 200 новых указателей объектов в вектор и выбирать 100 из них для стиранияиспользуйте функцию стирания ().И для каждого стертого объекта я использую delete , чтобы освободить память.И в последней строке деструктора я использую sizeof (this) , чтобы проверить, была ли память освобождена успешно.Всегда возвращается 0.

Но я использую команду top в ubuntu, чтобы проверить использование памяти для этого процесса.Около 3 400 итераций, он будет использовать 89% памяти для моей 2 ГБ памяти.Я предполагаю, что это потому, что освобожденная память из объекта Myclass не использовалась каким-то образом, а вектор продолжает запрашивать память у ОС.

У кого-нибудь есть идеи по этому поводу?

Ответы [ 6 ]

2 голосов
/ 07 ноября 2011

А как насчет использования std::shared_ptr<object> вместо обычных указателей?

Похоже, у вас может быть утечка памяти.

2 голосов
/ 07 ноября 2011

И в последней строке деструктора я использую sizeof (this), чтобы проверить, была ли память освобождена успешно.

sizeof(this)? Не уверен, что вы на самом деле хотели знать, но sizeof является конструкцией во время компиляции и никогда не может сказать вам, что что-то произошло во время выполнения.

Но я использую команду top в ubuntu, чтобы проверить использование памяти для этого процесса. Около 3 400 итераций, он будет использовать 89% памяти для моей 2 ГБ памяти. Я предполагаю, что это потому, что освобожденная память из объекта Myclass не была повторно использована каким-либо образом

Возможно, у вас утечка памяти. Это может быть вызвано, например. по ошибке в вашем коде деструктора.

Попробуйте запустить вашу программу под valgrind с --leak-check=full.

1 голос
/ 07 ноября 2011

Вектор не будет использовать более чем в 1,5–2 раза больше памяти, чем требуется (я думаю, что большинство реализаций в 1,5 раза, но это, вероятно, не стандартно). Кроме того, поскольку указатели имеют размер от 4 до 8 байт, вектор указателей обычно не займет много места, по крайней мере, до тех пор, пока вы не попадете в миллионы элементов.

Я запутался, почему вы добавляете 200 объектов и удаляете 100 объектов в каждом цикле. Если я не пойму вас неправильно, количество объектов в вашей куче будет расти бесконечно. После 3400 итераций, при каждом добавлении чистых 100 объектов, у вас будет 300 000 объектов, что может легко занять 2 ГБ для нетривиального класса, даже если у вас нет утечки памяти (хотя это также кажется вероятным).

0 голосов
/ 07 ноября 2011

И в последней строке деструктора я использую sizeof (this), чтобы проверить, была ли память освобождена успешно.Всегда возвращается 0.

Поскольку this является указателем, sizeof(this) оценивается ( во время компиляции , как всегда) в размере указателя, который равенобычно 4 или 8 в современных системах.Кроме того, sizeof(something) не будет никогда вернет 0.

Если вы опубликуете часть своего кода, возможно, мы сможем дать лучший совет.

0 голосов
/ 07 ноября 2011

не видя код, все, что я могу предложить, это использовать

std::vector<object> вместо std::vector<object*>

или

boost::ptr_vector
0 голосов
/ 07 ноября 2011

И в последней строке деструктора я использую sizeof (this), чтобы проверить, была ли память освобождена успешно.Всегда возвращается 0.

Я не думаю, что это делает то, что вы думаете.

Но я использую команду top в Ubuntu, чтобы проверить использование памятидля этого процесса.Около 3 400 итераций, он будет использовать 89% памяти для моей 2 ГБ памяти.Я предполагаю, что это потому, что освобожденная память из объекта Myclass не использовалась каким-то образом, а вектор продолжает запрашивать память у ОС.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...