在分配期间,在不需要的对象上调用析构函数

eug*_*ene 5 c++ destructor variable-assignment

myClassVar = MyClass(3);  
Run Code Online (Sandbox Code Playgroud)

我期望在之前创建myClassVar的左侧调用析构函数.
但它实际上是在创建的新对象上调用的MyClass(3).

我的完整测试代码和输出如下..

编辑

我该如何解决这个问题?
实现赋值运算符?
MyClass实际上有指针和MYSQL_STMT*,我想知道我应该如何处理MYSQL_STMT*变量.

我只需要MyClassVar(3)对象而不是MyClassVar(),它是在创建ClientClass对象时首次创建的.

我经常遇到这种情况,并想知道是否有一个很好的方法来做到这一点.

#include <stdio.h>

class MyClass
{
public:
    MyClass() { printf("MyClass %p\n", this); }
    MyClass(int a) { printf("Myclass(int) %p\n", this); }
    ~MyClass() { printf("~MyClass %p\n", this); }

private:
    int mA;
};


class ClientClass
{
public:
    void Foo()
    {
        printf("before &myClassVar : %p\n", &myClassVar);
        myClassVar = MyClass(3); // this is the important line
        printf("after &myClassVar : %p\n", &myClassVar);
    }

private:
    MyClass myClassVar;
};

int main()
{   
    ClientClass c;
    c.Foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
MyClass 0x7fff5fbfeba0
before &myClassVar : 0x7fff5fbfeba0
Myclass(int) 0x7fff5fbfeb70
~MyClass 0x7fff5fbfeb70 // <--- here destructor is called on the newly created object
after &myClassVar : 0x7fff5fbfeba0
~MyClass 0x7fff5fbfeba0
Run Code Online (Sandbox Code Playgroud)

Mys*_*ial 6

以下是关键线的分解方式:

myClassVar = MyClass(3);
Run Code Online (Sandbox Code Playgroud)

首先,MyClass(3)调用构造函数并返回该对象.

其次,myClassVar =将对象复制到myClassVar.

然后声明结束.对象(它是立即的)已经死了,因此调用了析构函数.

编辑:

至于如何解决这个问题.我能想到的唯一方法是使用展示位置.我不确定除了制作"set"方法之外是否还有更好的解决方案.