умные указатели и массивы - PullRequest
41 голосов
/ 16 июля 2011

Как умные указатели обрабатывают массивы?Например,

void function(void)
{
    std::unique_ptr<int> my_array(new int[5]);
}

Когда my_array выходит из области видимости и разрушается, весь ли массив целых чисел повторно запрашивается?Только первый элемент массива исправлен?Или что-то еще происходит (например, неопределенное поведение)?

Ответы [ 2 ]

72 голосов
/ 16 июля 2011

Это вызовет delete[], и, следовательно, будет восстановлен весь массив, но я считаю, что вам нужно указать, что вы используете массив в виде unique_ptr:

std::unique_ptr<int[]> my_array(new int[5]);

Это называется Частичная специализация из unique_ptr.

3 голосов
/ 16 июля 2011

Редактировать: Этот ответ был неправильным, как объясняется в комментариях ниже.Вот что я первоначально сказал:

Я не думаю, что std :: unique_ptr знает, как вызвать delete [].В действительности он имеет член int * в качестве члена - когда вы удаляете int *, он удалит весь массив, так что в этом случае все в порядке.

Единственная цель удаления [], в отличие отнормальным удалением является то, что он вызывает деструкторы каждого элемента в массиве.Для примитивных типов это не имеет значения.

Я оставляю это здесь, потому что я чему-то научился - надеюсь, что другие тоже.

...