使用malloc和free进行对象创建和删除? (只是实验)

时间:2014-03-23 12:12:00

标签: c++

为什么即使分配或释放内存,也不会调用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是没用的还是没用?

3 个答案:

答案 0 :(得分:1)

这里一切都很好。
构造函数/析构函数只是里面的正常函数 malloc的作用:保留xy字节的内存 新功能:调用malloc(或类似的东西),然后调用构造函数 Malloc不应该调用任何构造函数(并且它不能,
因为它不知道哪一个。它确实只知道字节数。)

如果你想手动处理内存,然后只需调用构造函数,
见“置新”

答案 1 :(得分:0)

malloc中没有任何内容可以触发调用你的描述符; malloc不是用于分配对象来分配缓冲区以供一般使用(通常不用于c ++)。由于malloc是一个C库而且对C ++一无所知,因此考虑调用C ++构造函数似乎有点不合适 - 特别是考虑到构造函数可以有参数而malloc无法接收它们。

如果您有正当理由使用malloc来分配将成为对象的内容,那么您仍然有责任确保调用构造函数和析构函数。您可以使用newdelete进行此操作,但您的new来电被修改为“新展示位置”。与malloc一起使用它是非常罕见的,但它在你的例子中的用途是:

    void *ap_addr = void*)malloc(sizeof(a));
    ap = new(ap_addr)a();
    ap->i = 11;

请注意,您现在负责同时调用delete(以调用析构函数), free()(以释放缓冲区)。当然,如果您要重用它,缓冲区释放是可选的。例如。

答案 2 :(得分:-1)

  1. 应为int main
  2. 使用新的&gt;
  3. 有什么问题
  4. 不要将new / malloc与delete / free混合使用
  5. 使用nullptr not NULL