所以我和一个 friend 发生了争执,还有什么比 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
,你会发生内存泄漏抛出异常。如果元素赋值抛出,就会发生这种情况。这一切都取决于T
和 rhs
的状态.
具体来说,如果对于任何非负整数 n < rhs._size
,您将泄漏内存, 以下抛出:
*(_data + n) = *(rhs._data + n);
关于c++ - 这段代码是否泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34669745/