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

sri*_*anp 6 c++

请参阅以下代码:

 #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;
 }
Run Code Online (Sandbox Code Playgroud)

我以为上面的代码会显示错误,但它编译成功并显示输出

5
destructor
Process returned 0 (0x0)   execution time : 0.270 s
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

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

  3. 我可以malloc()用于分配和delete解除分配还是new用于分配和free()解除分配?

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

Lig*_*ica 12

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

是的,您可以分配内存,malloc然后该内存可用于存储对象。

但是,让我们重新表述一下:

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

不。

您的程序具有未定义的行为,因为您从未创建过 object

相反,对 C++ 类对象使用new/ delete(或智能指针),或者只是以正常方式声明它们。

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

正是这样。它分配内存,但实际上并不ex在该内存中构造任何对象。

如果您确实需要,您现在可以使用新的展示位置来执行此操作。

我可以使用 malloc() 进行分配和删除以进行解除分配,或使用 new 进行分配并使用 free() 进行解除分配吗?

不。

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

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


eer*_*ika 8

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

当然。但是 malloc 不创建任何对象。可以使用 new 表达式创建具有动态存储的对象。Placement-new 可用于在使用 malloc 分配的内存中创建对象。

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

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

3)我可以使用 malloc() 进行分配和删除进行解除分配或使用 new 进行分配,使用 free() 进行解除分配吗?

仅当您不介意您的程序具有未定义的行为时。你应该介意。Free 只能与来自 malloc(或 realloc、strdup 等)的指针一起使用。delete 只能与来自 new 的指针一起使用。delete[] 只能与来自 new[] 的指针一起使用。

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

构造函数对是否调用析构函数没有影响。当对象被销毁时调用析构函数。delete破坏指向的对象。如果没有对象,则程序的行为是未定义的。您的程序就是这种情况。行为也是未定义的,因为指针不是 new 的结果,而是 malloc 的结果。也因为成员函数是通过指向不存在对象的指针调用的。