其他分享
首页 > 其他分享> > c – 我是否正确删除了这个?

c – 我是否正确删除了这个?

作者:互联网

我有一些结构:

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

如果要为原始内存分配原始内存,则直接使用分配函数更为常规.例如

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

但考虑做一些更简单的事情.该块可以用单个局部变量替换,该变量更加健壮.

A tmp("tmp");

标签:c,memory-management,delete-operator
来源: https://codeday.me/bug/20190827/1741099.html