c++ - C+ : Destructor for same instance of an object called twice

标签 c++ class pointers destructor

所以基本上我在 VS2013 中有一些看起来像这样的 C++ 代码

#include "stdafx.h"
#include <malloc.h>
#include <stdio.h>

class Test_Class {
public:
    Test_Class() {
        printf("In Test_Class()\n");
        allocated_array = (int*)malloc(sizeof(int) * 64);
        printf("Allocated %p\n", allocated_array);
    }

    ~Test_Class() {
        printf("In ~Test_Class()\n");
        printf("Freeing %p\n", allocated_array);
        free(allocated_array);
        printf("Freed %p\n", allocated_array);
    }
private:
    int* allocated_array;
};

class Holder {
public:
    Holder() {
        printf("In Holder()\n");
        m_test_class = Test_Class();
    }

    ~Holder() {
        printf("In ~Holder()\n");
    }
private:
    Test_Class m_test_class;
};

class Game {
public:
    Game() {
        printf("In Game()\n");
        m_holder = Holder();
    }

    ~Game() {
        printf("In ~Game()");
    }
private:
    Holder m_holder;
};

int main()
{
    printf("In main()\n");
    Game game = Game();
    return 0;
}

当运行时,给我这个输出:

http://i.imgur.com/g8vCdIo.png

我想知道的是,为什么同一个 Test_Class 对象的析构函数在崩溃前被调用两次(因为试图释放同一个指针两次)。我检查了调试器,以确保它不仅仅是一个类的新实例,它被赋予了与另一个对象相同的指针,而且确实是完全相同的对象。

我知道由于 Test_Class 对象是 Holder 的成员,它会创建一个 Test_Class 对象,然后创建另一个对象并销毁旧对象(它似乎这样做),但是这种调用析构函数的奇怪行为当我在 Game 类中创建 Holder 类型的成员时,似乎也会发生同样的情况。显然我缺少一些东西。

最佳答案

原因是,您的编译器无法消除复制赋值 Game game = Game();

正确的代码应该是Game game;

您的代码所做的是将一个对象构造为右值,并将其分配给一个作为左值的新对象 game。所以在这一行 Game game = Game(); 中构造了两个对象,其中一个在赋值后立即销毁。

编辑:

同样适用于 m_Holder 等等 - 当然。

关于c++ - C+ : Destructor for same instance of an object called twice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37164108/

相关文章:

c++ - 不确定 Typedef 和类的位置

c++ - 如何在类初始化时将类插入到 STL 映射中

swift - 使用 Parse 和 Swift 返回具有指针 ID 的所有对象

c++ - 奇怪的程序错误结束

c++ - C++ Visual Studio代码未与工作区中的单个文件夹一起编译

c++ - Boost 确实减慢了 VS2005 上的编译速度

c++ - 通过不同类型的指针删除缓冲区?

c++ - 循环包含

java - 在 Java 中创建类数组

c++ - 为什么同一个指针有不同的地址