是否可以使用 malloc 为类对象分配内存?

Can I allocate memory for class objects using malloc?

本文关键字:对象 分配 内存 可以使 malloc 是否      更新时间:2023-10-16

请参阅以下代码:

#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用于解除分配,
  4. 或者new用于分配,free()用于解除分配?

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

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

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

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

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

不。

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

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

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

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

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

我可以使用 malloc(( 进行分配和删除以进行解除分配,或者使用 new 用于分配和 free(( 进行释放吗?

不。

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

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

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

确定。但是 malloc 不会创建任何对象。可以使用新表达式创建具有动态存储的对象。放置-new 可用于将对象创建到使用 malloc 分配的内存中。

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

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

3(我可以使用malloc((进行分配,删除用于释放或新建进行分配,free((进行释放吗?

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

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

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