【问题标题】:Clarification regarding claim that the class Safe is exception safe关于 Safe 类是异常安全的声明的澄清
【发布时间】:2012-12-11 03:06:22
【问题描述】:

您会在this document 的第 937 页上找到以下代码:

template<class T> class Safe
{
    T* p;  // p points to a T allocated using new
    public:
    Safe() : p(new T) {}
    ~Safe() { delete p; }
    Safe& operator=(const Safe& a) { *p = *a.p; return *this; }
    // ...
};

看起来,p指向的对象会在上面的赋值运算符中泄露。

【问题讨论】:

    标签: c++ memory-leaks assignment-operator


    【解决方案1】:

    这不是泄漏,因为他没有更改指针。如果他这样做了

    Safe& operator=(const Safe& a) { p = a.p; return *this; }
    

    那么这将是内存泄漏。他正在对 p 指向的对象进行赋值,而不是对 p 本身。

    【讨论】:

      【解决方案2】:

      没有。不会有泄漏,因为他没有更改指针。当然,还是少了拷贝构造函数,但除此之外,就没有错误了。

      【讨论】:

      • 我把答案归功于你,因为这是我收到的第一个。
      【解决方案3】:

      分配不是问题:分配的不是指针而是指向的值。假设T 的分配是异常安全的,Safe&lt;T&gt; 的复制分配也是安全的。但是,该类缺少复制构造函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 2019-04-28
        • 2012-08-22
        相关资源
        最近更新 更多