在赋值运算符之前调用的struct的析构函数

Bea*_*kie 1 c++ operator-overloading assignment-operator

我有一个结构,Foo,指针数组为Bar.

struct Foo
{
    Bar* _BarList;

    Foo()
    {
        _BarList = new Bar[1];
        _BarList[0] = Bar(10, 20);
    }

    Foo& operator=(const Foo& foo)
    {
        Bar* tmpBarList = new Bar[1];

        tmpBarList[0] = foo._BarList[0];

        delete[] _BarList;

        _BarList = tmpBarList;

        return *this;
    }

    ~Foo()
    {
        delete[] _BarList;
    }
};
Run Code Online (Sandbox Code Playgroud)

我这样称呼它

Foo baz = fooFunc();
Run Code Online (Sandbox Code Playgroud)

(似乎)如果我在函数(fooFunc)中创建一个Foo(f)实例并返回它,则在返回值之前调用析构函数,因为我丢失了_BarList的内容.

这在函数中创建是有意义的.这是一个例子.

Foo fooFunc()
{
    Foo f = Foo();
    return f;
}
Run Code Online (Sandbox Code Playgroud)

如果我在返回时直接返回Foo的实例,则直到调用了equals运算符之后才调用该项的析构函数(通过调用行上的equals语句).

Foo fooFunc()
{
    return Foo();
}
Run Code Online (Sandbox Code Playgroud)

我想这是有道理的,因为我在对象中创建Foo,并且在返回对象之前清除了一些东西.

我想我可以通过这样做返回来解决这个问题(在编写一个新的构造函数来获取Foo之后):

Foo fooFunc()
{
    Foo f = Foo();
    return Foo(f);
}
Run Code Online (Sandbox Code Playgroud)

1)我的假设是对的吗?

2)是否有另一种方法可以不需要这么多的重复赋值运算符?

编辑:请考虑这个函数通常会做的不仅仅是返回Foo()!

Rei*_*ica 5

你的班级违反了三条规则.您有一个析构函数和一个复制赋值运算符,但没有复制构造函数.而默认的一个绝对不能满足您的需求.

并注意所有这些行:

Foo f = Foo();
return Foo(f);
Foo baz = fooFunc();
Run Code Online (Sandbox Code Playgroud)

使用复制构造函数,而不是赋值运算符.赋值运算符仅用于分配现有对象,从不用于创建/初始化新对象.