Gol*_*boa 2 c++ pointers destructor class
所以基本上我在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;
}
Run Code Online (Sandbox Code Playgroud)
那个跑的时候,给我这个输出:
我想知道的是,为什么同一个Test_Class对象的析构函数在崩溃之前被调用两次(由于试图释放两次相同的指针).我使用了调试器,以确保它不仅仅是一个新的类实例,它被赋予了与另一个对象相同的指针,而且确实它是完全相同的对象.
我理解,因为Test_Class对象是Holder的成员,它会创建一个Test_Class对象,然后创建另一个并销毁旧的(它似乎做),但这种奇怪的行为在同一个上调用析构函数似乎当我在Game类中创建Holder类型的成员时发生.显然有一些我不知道的东西.
原因是,您的编译器无法消除副本分配Game game = Game();.
正确的代码是Game game;.
您的代码所做的是将对象构造为rvalue,将其分配给game一个左值的新对象.因此,在这一行Game game = Game();中,构造了两个对象,其中一个在分配后立即被破坏.
编辑:
同样适用于m_Holder等等 - 当然.
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |