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

时间:2014-02-14 11:04:18

标签: c++ memory destructor allocation delete-operator

我想知道是否必须在示例中删除此指针,如下所示:

class Person
{
  public:
    Person(char *name) :_name(name) {}

    // Is this delete necessary?
    ~Person() {
        cout<<"Godbay Person"<<endl;
        delete _name;
    }

  private:
    char * _name;
}

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

有两种可能性:

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

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

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

    但是:如果可能的话,避免使用普通(字符串)指针,对于案例1.使用一些内存管理类(字符串类或智能指针)来获取摆脱手动管理内存所有权的麻烦。除非您无法访问最新的C ++编译器,否则deletedelete[]应该很少出现在您的代码中。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这取决于创建程序。

在这种情况下没有:

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字符串指针。