我正在做一个小实验,以更好地理解构造函数/析构函数何时被隐式调用,我发现了一些非常奇怪的东西。
以下代码在调用时调用默认的复制构造函数myFunction()
。在退出 myFunction() 的范围之前,我的用户定义~myClass()
被调用,它应该调用free()
on dangerData
。但是,这似乎并没有释放dangerData
!
#include <cstdio>
#include <cstdlib>
class myClass {
static int nextid;
int myID;
char *dangerData;
public:
myClass() {
myID = nextid++;
printf("Constructing myClass number %d\n", myID);
dangerData = (char *)malloc(1024);
dangerData[12] = 0;
}
~myClass() {
printf("Destructing myClass number %d. dangerData = %p\n", myID, (void *) dangerData);
dangerData[12] = 'a'; //Mark the array
free(dangerData); //This call chould free the array... but it doesn't!
}
void msg() {
printf("Message from myClass number %d. dangerData[12] = %d\n", myID, dangerData[12]);
}
};
int myClass::nextid = 1;
void myFunction(myClass param) {
param.msg();
}
int main() {
myClass m;
myFunction(m); //Calls default copy constructor
m.msg();
return 0;
}
这段代码的输出是:
Constructing myClass number 1
Message from myClass number 1. dangerData[12] = 0
Destructing myClass number 1. dangerData = 02f71458. dangerData[12] = 0
Message from myClass number 1. dangerData[12] = 97
Destructing myClass number 1. dangerData = 02f71458. dangerData[12] = 97
对析构函数的第一次调用肯定是调用free()
malloc 的数组,但是对m.msg()
in的调用main()
仍然可以在没有段错误的情况下访问它!
这应该发生吗?