为什么即使分配或释放内存,也不会调用ctor和dtor?这里到底发生了什么?请分享您的想法。
#include<iostream>
#include<stdlib.h>
using namespace std;
class a{
public:
int i;
a() {cout<<"\n a ctor \n";}
~a(){cout<<"\n a dtor \n";}
};
main() {
a *ap = NULL;
ap = (a*)malloc(sizeof(a));
ap->i = 11;
cout<<ap->i<<"\n";
cout<<ap<<"\n";
free(ap); //does this actually work? Does this free the memory?
cout<<ap<<"\n";
ap = NULL;
cout<<ap;
}
上述意思是ctor和dtor是没用的还是没用?
答案 0 :(得分:1)
这里一切都很好。
构造函数/析构函数只是里面的正常函数
malloc的作用:保留xy字节的内存
新功能:调用malloc(或类似的东西),然后调用构造函数
Malloc不应该调用任何构造函数(并且它不能,
因为它不知道哪一个。它确实只知道字节数。)
如果你想手动处理内存,然后只需调用构造函数,
见“置新”
答案 1 :(得分:0)
malloc
中没有任何内容可以触发调用你的描述符; malloc不是用于分配对象来分配缓冲区以供一般使用(通常不用于c ++)。由于malloc是一个C库而且对C ++一无所知,因此考虑调用C ++构造函数似乎有点不合适 - 特别是考虑到构造函数可以有参数而malloc无法接收它们。
如果您有正当理由使用malloc
来分配将成为对象的内容,那么您仍然有责任确保调用构造函数和析构函数。您可以使用new
和delete
进行此操作,但您的new
来电被修改为“新展示位置”。与malloc一起使用它是非常罕见的,但它在你的例子中的用途是:
void *ap_addr = void*)malloc(sizeof(a));
ap = new(ap_addr)a();
ap->i = 11;
请注意,您现在负责同时调用delete
(以调用析构函数),和 free()
(以释放缓冲区)。当然,如果您要重用它,缓冲区释放是可选的。例如。
答案 2 :(得分:-1)
int main