Ответ 1
У вас также могут быть автоматические экземпляры вашего класса, которые не используют new
, как:
class A{};
//automatic
A a;
//using new
A *pA = new A();
//using malloc and placement-new
A *pA = (A*)malloc(sizeof(A));
pA = new (pA) A();
//using ONLY placement-new
char memory[sizeof(A)];
A *pA = new (memory) A();
Последние два используют place-new, который немного отличается от нового. placement-new используется для построения объекта путем вызова конструктора. В третьем примере malloc
выделяет только память, он не вызывает конструктор, поэтому для создания объекта используется конструктор new-new.
Также обратите внимание, как удалить память.
//when pA is created using new
delete pA;
//when pA is allocated memory using malloc, and constructed using placement-new
pA->~A(); //call the destructor first
free(pA); //then free the memory
//when pA constructed using placement-new, and no malloc or new!
pA->~A(); //just call the destructor, that it!
Чтобы узнать, что такое размещение, ознакомьтесь с этими часто задаваемыми вопросами:
- Что такое "размещение нового" и почему я должен его использовать? (FAQ на parashift.com)
- размещение нового (FAQ на stackoverflow.com)