应该使用自动存储器将析构函数包含在指针中吗?

时间:2015-09-28 17:44:36

标签: c++ pointers destructor

当我创建一个类,在其中包含一个指针,并在自动存储中创建一个对象时,我应该在类中包含一个析构函数吗? (是否有必要释放内存中的空间?) 例如:

class Node{
    char *Name;
    int age;
    Node(char *n = 0, int a = 0) {
        name = strdup(n);
        age = a;
    }
    ~Node(){
        if (name != 0)
            delete(name);
    }
}

Node node1("Roger",20);

3 个答案:

答案 0 :(得分:4)

  

是否有必要释放内存中的空间?

是的,避免内存泄漏至关重要。

无论如何,您必须在示例中使用free(name);,因为strdup()是纯C函数,并使用malloc()函数为返回的副本分配内存。

此外,您应该避免在C ++中自己管理原始指针。使用smart pointersstandard C++ containers,或仅针对您的具体情况std::string

原始指针与执行Rule of Three (5/zero)

相比并不复杂

如果您从C风格的界面中分配了某些内容,则可以始终使用智能指针,并提供实际使用相应free()调用的自定义删除功能。

答案 1 :(得分:2)

如果您的类的指针指向分配有new \ new[] \ malloc()的内存,那么您需要实现Rule of Three

也就是说,不是使用原始char *和手动内存管理,而是使用std::string。如果你需要它用于其他功能,你仍然可以获得const char*,但它是完全自我管理的容器。有了它,您将不需要提供复制构造函数或析构函数,因为编译器提供的默认值将起作用。

答案 2 :(得分:1)

是的,这是必须的,以避免内存泄漏。如果你正在使用课程或其他东西并不重要。 strdup说的很重要。但是,您不能使用delete,而是使用freestrdup中的内存是使用malloc而不是new创建的。

http://pubs.opengroup.org/onlinepubs/009695399/functions/strdup.html

  

strdup - 复制字符串

     

返回的指针可以传递给 free()。空指针是   如果无法创建新字符串,则返回。

P.S。不要在const的声明中错过char *n,否则调用者可能会期望字符串被修改,并且在没有警告的情况下不能传递简单字符串文字。

P.S.2:首选使用nullptr代替0。这已在SO上多次讨论过。