C ++ new & delete и функции - PullRequest
       34

C ++ new & delete и функции

3 голосов
/ 03 июня 2010

Это немного неясно для меня ... Итак, если у меня есть функция:

char *test(int ran){
    char *ret = new char[ran];
    // process...
    return ret;
}

, а затем вызвать его несколько раз:

for(int i = 0; i < 100000000; i++){
   char *str = test(rand()%10000000+10000000);
   // process...

   // delete[] str; // do i have to delete it here?
}

Итак, вопрос в том, должен ли я использовать delete[] для каждого new[] вызова?

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

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

5 голосов
/ 03 июня 2010

Да, да, иначе будет утечка памяти.

Хотя это не самая лучшая идея - распределять в одной функции и бесплатно в другой. Почему бы не выделить в цикле for и передать указатель на test - это удержит вместе new и delete в коде.

3 голосов
/ 03 июня 2010

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

vector<char> (int ran){
    vector<char> ret(char);
    // process...
    return ret;
}

И назвать это:

for(int i = 0; i < 100000000; i++){
   vector<char> str = test(rand()%10000000+10000000);
   // process...
}

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

На самом деле, вы также, вероятно, хотите использовать std :: string вместо char * (я использовал вектор, чтобы привести более общий пример).

Не беспокойтесь о данных, которые будут скопированы. Компилятор оптимизирует его. Редактировать : хорошо, это может не оптимизировать его :), однако есть большие шансы, что так и будет. И пока проблем с производительностью нет, выбирайте простейшую версию.

...