这段代码会泄露内存吗

Does this piece of code leak memory?

本文关键字:内存 段代码 代码      更新时间:2023-10-16

所以我和一个朋友发生了争吵,还有什么比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; }
};

是的,您可能会泄漏内存。

如果std::copy抛出异常,则会发生内存泄漏。如果元素赋值抛出,就会发生这种情况。这一切都取决于Trhs的状态。

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

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