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

时间:2016-01-08 04:52:18

标签: c++ memory-management memory-leaks

所以我和朋友争吵了,有什么比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 个答案:

答案 0 :(得分:8)

是的,你可以泄漏内存。

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

具体而言,如果对于任何非负整数n < rhs._size,您将泄漏内存,以下内容:

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