请参阅以下代码:
#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)
我的问题是:
我可以使用 为对象分配内存malloc吗?
如何malloc为没有构造函数参数的类分配内存?
我可以malloc()用于分配和delete解除分配还是new用于分配和free()解除分配?
没有构造函数如何调用析构函数?
Lig*_*ica 12
我可以使用 malloc 为对象分配内存吗?
是的,您可以分配内存,malloc然后该内存可用于存储对象。
但是,让我们重新表述一下:
我可以使用创建类对象
malloc吗?
不。
您的程序具有未定义的行为,因为您从未创建过 object。
相反,对 C++ 类对象使用new/ delete(或智能指针),或者只是以正常方式声明它们。
malloc如何为没有构造函数参数的类分配内存?
正是这样。它分配内存,但实际上并不ex在该内存中构造任何对象。
如果您确实需要,您现在可以使用新的展示位置来执行此操作。
我可以使用 malloc() 进行分配和删除以进行解除分配,或使用 new 进行分配并使用 free() 进行解除分配吗?
不。
没有构造函数如何调用析构函数?
没有有意义的方法来回答这个问题,因为您的程序具有未定义的行为。
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 的结果。也因为成员函数是通过指向不存在对象的指针调用的。