Исключение памяти в с ++ - PullRequest
1 голос
/ 24 марта 2012

Увеличивает ли следующий код выделенную память непрерывно при ее повторном вызове?

  void ArrayStorage::merge(int low, int mid, int high)
    {
    int start = low;    
    int marker = low;
    int secondStart = mid + 1;

    temp = new string [high + 1];
        //rest of the code
    }

Пожалуйста, поделитесь со мной, если вы знаете об этом ...

Ответы [ 3 ]

3 голосов
/ 24 марта 2012

Да , потому что вы не удаляете память, выделенную new.

. Правильный путь:

void ArrayStorage::merge(int low, int mid, int high)
{
    int start = low;    
    int marker = low;
    int secondStart = mid + 1;

    temp = new string [high + 1];
    //rest of the code
    delete[] temp; //free the memory 
}

В C ++ нетавтоматическое управление памятью для динамически размещаемых объектов.Каждый раз, когда вы вызываете new или malloc (этот метод обычно для C), вы выделяете память в динамическом хранилище, которое вы несете ответственность за освобождение, через delete или free соответственно.В вашем случае вы выделяете массив размером high + 1, который необходимо освободить с помощью delete[].

РЕДАКТИРОВАТЬ: Как уже отмечали другие, может быть std::vector лучше подходит, но это зависит от того, что вы хотите сделать.Посмотри.

2 голосов
/ 24 марта 2012

Да, если только вы не удаляете память, выделенную каждый раз на

temp = new string [high + 1];

в вашем "остальном коде".

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

Когда вы вызываете new, вы выделяете память из кучи. Эта память освобождается одним из двух способов; первый способ - кто-то вызывает delete (в основном вы или используемая вами библиотека), а второй - завершением программы.

Просто педантичное примечание, оно в конечном итоге перестанет потреблять память, потому что ваша система перестанет позволять новым работать (есть верхний предел).

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