Как делают я вызываю свой станд.:: карта для освобождения используемой памяти?

Я использую станд.:: карта, и я, может казаться, не освобождаю память назад к ОС. Это похоже,

int main(){
  aMap m;

  while(keepGoing){
    while(fillUpMap){
       //populate m
    }
    doWhatIwantWithMap(m);
    m.clear();//doesnt free memory back to OS

    //flush some buffered values into map for next iteration
    flushIntoMap(m);
  }
}

Каждый (fillUpmap) выделяет приблизительно 1 ГБ, таким образом, я очень интересуюсь возвращением этого к моей системе, прежде чем это съест всю мою память.

Я испытал то же со станд.:: вектор, но там я мог вызвать его к свободному путем выполнения подкачки с пустым станд.:: вектор. Это не работает с картой.

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

править:

Сброс должен появиться после ясного.

11
задан monkeyking 13 April 2010 в 11:23
поделиться

5 ответов

Если вы создаете карту в куче (с помощью new), ее удаление освободит всю используемую память.

1
ответ дан 3 December 2019 в 06:45
поделиться

Я провел простой тест, поместив некоторые данные в std :: map, а затем вызвав std :: map :: clear ().

typedef std::map<int, unit_t,std::less<int>,  
     my_allocator<std::pair<const int, unit_t>, 4 > > contaner_t;
contaner_t keys;
keys[1] = 10;
keys[2] = 20;
keys[3] = 30;
keys.clear();

это результат printf, вставленного в мой тест:

Allocator # 4, Memory consumption:      56     (allocated   :       56)
Allocator # 4, Memory consumption:     112     (allocated   :       56)
Allocator # 4, Memory consumption:     168     (allocated   :       56)
Allocator # 4, Memory consumption:     112     (deallocated :       56),
Allocator # 4, Memory consumption:      56     (deallocated :       56),
Allocator # 4, Memory consumption:       0     (deallocated :       56),

Я думаю, вам, вероятно, также следует проверить поведение вашего распределителя, но я думаю, что ваш std :: allocator по умолчанию фактически освобождает память, как вы ожидаете, но эта память не возвращается в ОС. Кстати какую ОС вы используете?

Вопрос в том, как вы измеряете, что не может освободить память обратно в ОС. и как вы можете быть уверены, что я смогу принудительно освободить его, выполнив подкачку с пустым std :: vector. Вы действительно уверены, что выделенная память действительно возвращается ОС?

1
ответ дан 3 December 2019 в 06:45
поделиться

m.clear() освобождает память обратно в кучу, но обычно реализации кучи не освобождают ее обратно в ОС (даже если они могут это сделать, такие проблемы, как фрагментация, затрудняют это).

Так работает аллокатор по умолчанию, если вы указали свой собственный аллокатор для карты, он может иметь свой собственный кэш. Однако даже в этом случае ее следует кэшировать, чтобы в любом случае можно было сразу же использовать повторно.

У карт нет понятия емкости и размера, как у векторов.

13
ответ дан 3 December 2019 в 06:45
поделиться

Возможно, вы могли бы создать собственный аллокатор или просто использовать библиотеку пулов от Boost.

0
ответ дан 3 December 2019 в 06:45
поделиться

Такое поведение является нормальным, библиотека времени выполнения сохраняет эту память, выделенную классом отображения, доступной для процесса, так что в следующий раз, когда ей потребуется выделить память, ей не придется обращаться к операционной системе. Это оптимизация библиотеки времени выполнения.

3
ответ дан 3 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: