这段代码是否会泄漏内存?

Dei*_*Dei 3 c++ memory-leaks memory-management

所以我和朋友争吵了,有什么比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; }
};
Run Code Online (Sandbox Code Playgroud)

Pau*_*ans 8

是的,你可以泄漏内存.

std::copy抛出异常会导致内存泄漏.如果元素赋值抛出,则会发生这种情况.这一切都取决于T和的状态rhs.

具体来说,如果对于任何非负整数n < rhs._size,以下抛出,您将泄漏内存:

 *(_data + n) = *(rhs._data + n);
Run Code Online (Sandbox Code Playgroud)

  • 要修复它,使用`std :: unique_ptr <T []>`而不是`T*`作为内部数组的类型.这也消除了对用户定义的析构函数的需要,并使复制赋值默认为删除而不是破坏. (2认同)