我能否使用malloc为类对象分配内存?

6
请看下面的代码:
 #include<iostream>
 #include<stdlib.h>


 using namespace std;

 class ex
 {
     int i;
public:
   ex(int x){
     i=x;
     cout<<"\nconstructor";
   }
   void setval(int x)
   {
       i=x;
   }
   int geti(){return i;}

   ~ex()
   {
     cout<<"\ndestructor";
   }
};

int main()
{
  ex *ob;

  ob=(ex*) malloc(sizeof(ex));

  ob->setval(5);

  cout<<ob->geti();

  delete ob;
 }

我原本以为上述代码会出现错误,但它却成功编译并显示输出结果

5
destructor
Process returned 0 (0x0)   execution time : 0.270 s

我的问题是:

  1. 我能使用malloc为对象分配内存吗?

  2. malloc如何为没有构造函数参数的类分配内存?

  3. 我可以使用malloc()进行分配和delete进行释放,或者使用new进行分配和free()进行释放吗?

  4. 没有构造函数,析构函数如何被调用?


4
请查看"C++ placement new"。 - hyde
2个回答

12

我可以使用malloc为对象分配内存吗?

是的,你可以使用malloc来分配内存,这个内存后续可以用来存储对象。

但是,让我们稍微改一下问法:

我可以使用malloc创建类对象吗?

不行。

因为你从未创建过对象,所以你的程序具有未定义行为。

相反,对于C++类对象,请使用new/delete(或智能指针)进行内存分配,或者只需以通常的方式声明它们。

malloc如何在没有构造函数参数的情况下为类分配内存?

确切地说,它分配了内存,但实际上没有在那块内存中构造任何ex对象。

如果你真的需要,现在可以使用placement new来构造对象。

我可以使用malloc()来分配内存,然后使用delete来释放内存,或者使用new来分配内存,然后使用free()来释放内存吗?

不行。

没有构造函数,析构函数如何被调用?

这个问题没有有意义的回答,因为你的程序具有未定义行为。


8

1) 我可以使用malloc为对象分配内存吗?

可以。但是,malloc不会创建任何对象。动态存储的对象可以使用new表达式创建。可以使用placement-new将对象创建到使用malloc分配的内存中。

2) malloc如何为没有构造参数的类分配内存?

分配一种类型或另一种类型的内存之间没有区别,除了内存量(以及可能是内存的对齐方式)。

3) 我可以使用malloc()进行分配,并使用delete进行释放,或者使用new进行分配并使用free()进行释放吗?

只有在您不介意程序具有未定义行为时才可以这样做。而你应该注意这个问题。free只能与来自malloc(或realloc、strdup等)的指针一起使用。delete只能与new的指针一起使用。delete[]只能与new[]的指针一起使用。

4) 如何在没有构造函数的情况下调用析构函数?

构造函数不影响是否调用析构函数。当对象被销毁时,析构函数被调用。delete销毁指向的对象。如果没有对象,则程序的行为是未定义的。这是您的程序所涉及的情况。由于指针不是由new产生的,而是malloc,因此行为也是未定义的。此外,因为调用了不存在对象的指针的成员函数,所以行为也是未定义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接