我无法解释他的行为

Behaviour I cant explain

本文关键字:无法解释      更新时间:2023-10-16

下面的代码实际编译并运行;

template <typename T> 
class heap_ptr
{
public:
    heap_ptr(T* p) : t(p) {}
    heap_ptr(const heap_ptr&) = delete;
    template<typename ... U> heap_ptr( U ... u )
    {
        t = new T(u...);
    }
    T* operator -> () { return t; }
    // T& operator = (const T& o) { (*t)=o; return *t; }
    operator T () { return *t; }
    ~heap_ptr() { delete t; }
private:
    T* t;
};
struct A { int x,y; A(int x,int y):x(x),y(y){} };
void try_it()
{
    heap_ptr<A> woop {8,11};
    A a{5,3};
    woop = a; // <- here
}

但是,标记的赋值将垃圾放入woop中。为什么它可以编译为什么我在woop里放垃圾?

注意:如果我取消对赋值操作符的注释,它会按预期工作,这不是问题。

如果我取消赋值操作符的注释,它会像预期的那样工作,那就是这不是问题

这正是问题所在。默认情况下生成的复制赋值操作符将复制指针,而不是指针后面的对象。然后销毁临时对象heap_ptr(a),删除指向的数据。

这个问题是由于没有实现你的operator=,你依赖于默认的一个,它会复制临时对象的指针,然后销毁它,一旦复制完成,给你留下一个无效的指针。

这是不遵循3规则(c++ 11中为5)而派生出的问题集的一个实例。但是,如果可以的话,你应该遵循零规则。


您正在尝试重新实现智能指针。只要使用std::unique_ptr,它就不会像你期望的那样编译:

struct A { int x,y; A(int x,int y):x(x),y(y){} };
void try_it()
{
    std::unique_ptr<A> woop{ new A(8, 11) };
    A a{5,3};
    woop = a;
}

现场演示