c++ - 在分配期间调用不需要的对象的析构函数

标签 c++ variable-assignment destructor

myClassVar = MyClass(3);  

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

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

编辑

我该如何解决这个问题?
实现赋值运算符?
MyClass其实是有指针的,还有MYSQL_STMT*,我想知道我应该如何处理MYSQL_STMT*变量。

我只需要 MyClassVar(3) 对象而不是在创建 ClientClass 对象时首先创建的 MyClassVar() 。

我经常遇到这种情况,想知道是否有好的方法。

#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;
}

MyClass 0x7fff5fbfeba0
before &myClassVar : 0x7fff5fbfeba0
Myclass(int) 0x7fff5fbfeb70
~MyClass 0x7fff5fbfeb70 // <--- here destructor is called on the newly created object
after &myClassVar : 0x7fff5fbfeba0
~MyClass 0x7fff5fbfeba0

最佳答案

临界线的分解方式如下:

myClassVar = MyClass(3);

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

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

然后语句结束。对象(立即数)已死,因此调用了析构函数。

编辑:

至于如何解决这个问题。我能想到的唯一方法是使用 placement new .除了制作“设置”方法之外,我不确定是否有更好的解决方案。

关于c++ - 在分配期间调用不需要的对象的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7926024/

相关文章:

c++ - 如何打开通用文件?

c++ - 我在 C++ 中使用很多结构是正常的吗?

c++ - __cxa_guard_acquire 中的死锁

c# - 析构函数不能保证完成运行吗?

c++ - scanf 返回条件

c - C 数组和素数

r - 使用命名列表转换变量

ios - 随机选择一个 socket 并设置其他 socket

c++ - 析构函数和复制构造函数调用..(为什么在这些时候调用它)

C++: STL: vector: remove: 析构函数调用