Создание нового объекта указателя в цикле - PullRequest
0 голосов
/ 18 ноября 2010

Скажем, я делаю что-то вроде этого

for(int i = 0; i < 10; i++)
{
    //create a pointer object using new
    //use the object
}

Нужно ли удалять объект-указатель после использования его в цикле?Я думал, что если я не удаляю его, он будет создавать новый объект 10 раз, а после этого объект просто будет зависать, поедая ресурсы.

Ответы [ 5 ]

5 голосов
/ 18 ноября 2010

Да, для каждого new должен быть соответствующий delete. (И delete[] для каждого new[].)

Тем не менее, путь C ++ будет избегать динамического хранения в максимально возможной степени и скорее использовать локальные автоматические переменные :

for(int i = 0; i < 10; ++i)
{
    some_class object;
    //use object
} // object gets destroyed here automatically 

Если вам нужно выделить этот объект динамически (что я сомневаюсь, но есть такие случаи), тогда использует умный указатель . Интеллектуальный указатель выполнит для вас delete, независимо от того, как вы покидаете область, к которой он относится:

for(int i = 0; i < 10; ++i)
{
    smart_ptr<some_class> object(new some_class());
    //use object
} // object gets destroyed here automatically 

Текущий стандарт знает только один умный указатель с именем std::auto_ptr, который будет делать то, что вам нужно в этом случае. В следующем стандарте появятся еще несколько, среди которых замена на std::auto_ptr с именем std::unique_ptr и на семантическую семантическую собственность std::shared_ptr. Ваш компилятор / std lib может фактически уже поддерживать их. Если нет, вы можете найти их среди множества замечательных библиотек, которые можно найти по адресу boost .


Кстати, обратите внимание, что я заменил ваш i++ на ++i. В случае int это не имеет никакого значения в вашем сценарии, но есть типы, для которых i++ может создать ненужную копию. (Если эффективность вас не касается, зачем программировать на C ++?)

4 голосов
/ 18 ноября 2010

Да.

Вы должны удалить что-то новое, когда оно вам больше не нужно, иначе вы получите утечку памяти.

1 голос
/ 18 ноября 2010

Да, технически их нужно удалить.

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

for(int i = 0; i < 10; i++)
{
    std::auto_ptr<int> x(new int(10));

    // automatically deleted after each iteration.
}
0 голосов
/ 18 ноября 2010

Да, вам нужно удалить его. Но выполнение новой / удаления каждой итерации цикла может быть не лучшим вариантом - вам нужно предоставить больше контекста, чтобы получить лучший совет.

0 голосов
/ 18 ноября 2010

Если бы вы были так склонны, вы могли бы использовать умный указатель (что-то вроде Boost's shared_pointer), а затем, как только указатель выйдет из области видимости в последний раз, объект будет автоматически удален.

...