2016-01-08 2 views
3

Итак, у меня был спор с другом, и какой лучший способ его решить, чем SO?Имеет ли эта часть кода утечка памяти?

Возьмем, к примеру, следующий упрощенный пример. Предположим, что все остальные функции реализованы правильно. Создает ли этот экземпляр копии утечку памяти?

Моя позиция заключается в том, что это определенно не означает. Он выделяет [rhs._size] памяти для нового объекта, который освобождается в деструкторе, когда объект выходит из области видимости, а выделенная память для rhs освобождается в собственном соответствующем деструкторе.

template<typename T> 
class dynarray 
{ 
private: 
    T* _data; 
    std::size_t _size; 

public: 
    dynarray(const dynarray& rhs) 
     : _data(new T[rhs._size]), _size(rhs._size) 
    { 
     std::copy(rhs._data, rhs._data + rhs._size, _data); 
    } 

    ~dynarray() { delete[] _data; } 
}; 
+1

Почему ваш друг думаю, что утечка памяти? Я не думаю, что это будет, но выглядит восприимчивым к удвоенным освобождениям из-за отсутствия оператора присваивания (просто используйте вектор). – ajshort

+0

Так что noob на вопрос, но как вы используете этот класс? (Объявить, использовать, цель) –

ответ

8

Да, вы можете утечка памяти.

У вас будет утечка памяти, если std::copy выдает исключение. Это может произойти, если выбрано назначение элемента. Все это зависит от T и состояния rhs.

В частности вы утечка памяти, если для любого целого неотрицательного n < rhs._size, следующие броски:

*(_data + n) = *(rhs._data + n); 
+2

Чтобы исправить это, используйте 'std :: unique_ptr ' вместо 'T *' как тип внутреннего массива. Это также устраняет необходимость в определяемом пользователем деструкторе и делает назначение копии по умолчанию удаленным, а не сломанным. –

+0

Справедливая точка. Я удалил свой ответ, потому что считаю, что ваш подход более технически правильный. Да, '' копия '' '' '' '' может быть 'noexcept', или нет, так что это зависит. – AndyG

Смежные вопросы