C++/析构函数-运算符删除

C++ / destructor - operator delete

本文关键字:运算符 删除 析构函数 C++      更新时间:2023-10-16

我想知道是否必须删除以下示例中的指针:

class Person
{
public:
Person(char *name) :_name(name) {}
// Is this delete necessary?
~Person() {
cout<<"Godbay Person"<<endl;
delete _name;
}
private:
char * _name;
}

无论如何,这肯定是错误的。

有两种可能性:

  1. 名称是在免费存储中专门为您的对象创建的,您的对象必须拥有所有权。然后必须删除该名称。

  2. 该名称不是在免费存储上创建的(例如,作为字符串litral,这是很可能的),或者其他对象正在管理该名称,因此您的对象不应承担所有权。然后任何删除都会对你的程序造成严重破坏。

那么,为什么即使在第一种情况下我也会说错呢?因为name听起来像一个字符串,而不是单个字符,这意味着name*将指向一个动态分配的字符数组。在这种情况下,删除它的正确方法是delete[] name

但是:如果可能,对于情况1,请避免使用纯(char)指针。使用一些内存管理类(字符串类或智能指针)来解决手动管理内存所有权的难题。deletedelete[]应该很少出现在代码中,除非您无法访问最新的C++编译器。

这是谁拥有分配的内存的问题,在这种情况下,看起来Person没有拥有它,所以没有,所以没有必要删除。像在Person中那样使用原始指针总是会引发所有权问题,这就是为什么建议使用shared_ptr/unique_ptr,甚至更好的std::string,因为它似乎是一个字符串。

通常,每次使用new创建指针时都必须调用delete。

这取决于创建过程。

在这种情况下,否:

Person *p = new Person("John");

在这种情况下是的:

char *str = new char[32];
::strcpy(str, "John");
Person *p = new Person(str);

在这种情况下是的,但使用::free函数,而不是运算符delete

char *str = (char *)::malloc(32);
::strcpy(str, "John");
Person *p = new Person(str);

考虑使用std::string而不是C字符串指针。