我问题的最接近的帖子是here。我正在尝试使用gcc编译以下代码:
#include <malloc.h>
class A
{
public:
A(){};
~A(){};
};//class A
int main()
{
A* obj = (A*) malloc( sizeof(A) );
if(obj==0) return 1 ;
obj->A::A(); /*error: invalid use of 'class A' */
obj->A::~A();
free(obj);
return 0;
};//
从命令行我用以下代码编译代码:
$ g++ -o main main.cpp main.cpp: In function 'int main()': main.cpp:22: error: invalid use of 'class A'
你能指出我正确的方向吗?
答案 0 :(得分:8)
您想要一个新的展示位置。
void* ptr = malloc(sizeof(A));
A* obj = new(ptr) A;
答案 1 :(得分:6)
您不能在对象上调用构造函数;只能在创建对象时调用构造函数,因此根据定义,该对象尚不存在。
执行此操作的方法是使用展示位置new
。没有必要投出malloc
回复。它应该是void *
,因为它不会返回指向A的指针;只是指向计划构造A
的原始内存的指针。
E.g。
void* mem = malloc( sizeof(A) );
A* obj = new (mem) A();
obj->~A();
free(mem);
答案 2 :(得分:2)
C ++中不需要malloc
业务。只需:
A* obj = new A();
new
分配内存并为您调用构造函数。
而且,为了摧毁它,请执行:
delete a;
delete
调用解构器方法并释放内存。
答案 3 :(得分:2)
由于您使用的是C ++,因此不需要回退到malloc
。您可以根据运算符new
int main() {
if(A* obj = new (std::nothrow) A()) {
delete obj;
return 0;
}
return 1;
}
如果分配失败,new
的nothrow版本会返回空指针,而不是抛出异常。