从GNU上的new运算符调用类构造函数 - 使用无效类

时间:2010-07-20 20:01:52

标签: c++ gcc

我问题的最接近的帖子是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'

你能指出我正确的方向吗?

4 个答案:

答案 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版本会返回空指针,而不是抛出异常。