A::A(const A& pat)
{
void* p = new char[sizeof(A)];
A* tmp = new (p) A("tmp");
tmp->~A();
delete tmp;//I WONDER IF HERE I SHOULD USE DIFFERENT delete[]?
}
Да, вы должны использовать delete [], так как вы создали память с новым []. Более того, до того, как вы достигнете конструктора (в данном случае конструктора копирования), память уже была выделена, поэтому нет необходимости выделять ее снова, как вы, похоже, пытаетесь здесь сделать.
Когда вы удаляете объект, деструктор (в данном случае ~ A) вызывается автоматически, поэтому нет необходимости явно вызывать его, если вы не используете новое размещение. Таким образом, при удалении нет необходимости явно удалять память, выделенную для самого объекта, только для принадлежащих ему элементов.
Конструктор копирования должен просто скопировать важную информацию из копируемой вещи.
Наконец, код здесь принимает строку: A a("a");
, поэтому вам понадобится строковой конструктор, чтобы сделать этот вызов:
A::A(const std::string& name)
{
//Do stuff
}