【发布时间】:2016-09-06 22:35:59
【问题描述】:
所以基本上我在 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;
}
运行时,给我这个输出:
我想知道的是,为什么同一个 Test_Class 对象的析构函数在它崩溃之前被调用两次(由于试图释放同一个指针两次)。我使用了调试器,以确保它不仅仅是一个新的类实例,它被赋予了与另一个对象相同的指针,而且确实它是完全相同的对象。
我知道由于 Test_Class 对象是 Holder 的成员,它会创建一个 Test_Class 对象,然后创建另一个对象并销毁旧对象(它似乎这样做),但是调用析构函数的这种奇怪行为当我在 Game 类中创建 Holder 类型的成员时,似乎也会发生同样的情况。显然,我缺少一些东西。
【问题讨论】:
-
有什么理由混合使用 c 和 c++ 内存管理?
-
您需要创建一个复制构造函数来打印以查看发生了什么。这样做,然后检查结果。
-
你违反了三法则。
-
去掉
m_test_class = Test_Class();这行,没必要,它会导致你的问题。您还应该禁用(或实现)Test_Class 的复制构造函数和复制赋值运算符,这样如果您确实犯了这个错误,编译器就会捕获它。 -
@Kerrek SB 你的意思是五法则吗?
标签: c++ class pointers destructor