我有一些结构:
struct A
{
const char* name_;
A* left_;
A* right_;
A(const char* name):name_(name),
left_(nullptr),
right_(nullptr){}
A(const A&);
//A(const A*);//ToDo
A& operator=(const A&);
~A()
{
/*ToDo*/
};
};
/*Just to compile*/
A& A::operator=(const A& pattern)
{
//check for self-assignment
if (this != &pattern)
{
void* p = new char[sizeof(A)];
}
return *this;
}
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[]?
}
int _tmain(int argc, _TCHAR* argv[])
{
A a("a");
A b = a;
cin.get();
return 0;
}
我知道这远非理想,远未完成。但是我想知道我是否以正确的方式删除了我的记忆(请不要告诉我如何正确执行它。我想自己弄清楚)。
这对我来说很重要的另一个问题是the link。
最佳答案
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会导致另一次析构函数调用是不正确的。您只需要释放内存。例如
delete[] static_cast<char*>(p);
如果您要分配原始内存以与放置
new
一起使用,则更常规的做法是直接使用分配函数。例如void* p = ::operator new[](sizeof(A));
A* tmp = new (p) A("tmp");
tmp->~A();
::operator delete[](p);
不过,考虑做一些简单的事情。可以用一个更强大的局部变量代替该块。
A tmp("tmp");