Вызовите конструктор класса из нового оператора в GNU - используйте недопустимый класс - PullRequest
3 голосов
/ 21 июля 2010

Ближайшая тема к моему вопросу здесь . Я пытаюсь скомпилировать следующий код с 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 ]

8 голосов
/ 21 июля 2010

Вы хотите новое место размещения.

void* ptr = malloc(sizeof(A));
A* obj = new(ptr) A;
6 голосов
/ 21 июля 2010

Вы не можете вызвать конструктор объекта;конструктор может быть вызван только при создании объекта, поэтому по определению объект еще не может существовать.

Способ сделать это с помощью размещения new.Нет необходимости разыгрывать ваше malloc возвращение.Это должно быть void *, поскольку оно не возвращает указатель на A;только указатель на необработанную память, в которой вы планируете построить A.

Например

void* mem = malloc( sizeof(A) );

A* obj = new (mem) A();
obj->~A();

free(mem);
2 голосов
/ 21 июля 2010

Поскольку вы используете C ++, возвращаться к malloc не нужно. Вы можете написать это с точки зрения оператора new

int main() {
  if(A* obj = new (std::nothrow) A()) {
    delete obj;
    return 0;
  }
  return 1;
}

Nothrow-версия new возвращает нулевой указатель в случае неудачного размещения вместо выдачи исключения.

2 голосов
/ 21 июля 2010

Нет необходимости в malloc бизнесе на C ++. Просто сделайте:

A* obj = new A();

new выделяет память и вызывает конструктор для вас.

И, чтобы уничтожить его, сделайте:

delete a;

delete вызывает метод деконструктора и освобождает память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...