一千萬個為什麽

搜索

我是否正確刪除了這個?

我有一些結構:

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;
}

我知道這遠非理想,遠未完成。但是我想知道我是否以正確的方式刪除了我的記憶(請不要告訴我如何正確地做到這一點。我正試圖弄清楚自己)。

這是指向不同問題的鏈接,這對我來說非常重要。

最佳答案

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(p);

如果要分配原始內存以用於放置 new ,則直接使用分配函數更為常規。例如

void* p = ::operator new[](sizeof(A));
A* tmp = new (p) A("tmp");
tmp->~A();
::operator delete[](p);

但考慮做一些更簡單的事情。可以用單個局部變量替換該塊,這將更加健壯。

A tmp("tmp");

轉載註明原文: 我是否正確刪除了這個?