Странная утечка памяти с большим динамическим массивом - PullRequest
0 голосов
/ 18 марта 2012

У меня есть следующий код

int main()
{
    int* myDynamicArray;
    myDynamicArray = new int[20000000];
    int numIte;
    cout << "number of iterations" << endl;
    cin >> numIte;
    for (int i = 0; i < numIte; ++i)
        foo(myDynamicArray);
    delete [] myDynamicArray;
    return 0;
 }

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

Ответы [ 2 ]

1 голос
/ 19 марта 2012

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

Если это так (и это не простой случай foo утечки памяти), то то, что вы можете измерять, - это объем фактически выделенной памяти. Выделение - 80 МБ, но фиксация памяти может не произойти, пока вы не получите доступ к массиву. Таким образом, большая часть массива, к которой обращается foo, может привести к выделению большего объема памяти.

1 голос
/ 18 марта 2012

Без полного определения foo на этот вопрос невозможно ответить. Однако вот некоторые мысли ...

Вероятно, хорошей идеей будет обернуть myDynamicArray внутри некоторой формы безопасного указателя, возможно, std :: auto_ptr или в случае, если foo может сохранить ссылку на указатель, std :: tr1 :: shared_ptr.

Если только вызов конструктора / функции foo не приводит к выделению дополнительной памяти, нет оснований полагать, что увеличение количества итераций цикла должно каким-либо образом повлиять на использование памяти во время выполнения программ.

Наконец, как вы контролируете использование памяти программой во время выполнения? Наблюдение за числами в диспетчере задач Windows (или его эквиваленте) не является особенно надежным решением, вы можете попробовать вручную отследить все выделения памяти (переопределив new / malloc), чтобы получить истинное представление о том, когда, где и сколько памяти используется. выделено в кучу.

...