使用自动存储的指针应该包含析构函数吗?

should a destructor be included with a pointer using automatic storage?

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

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

是的,这是强制性的,以避免内存泄漏。使用 class 或其他东西并不重要。 strdup 说的很重要。但是你一定不能使用delete,而是使用freestrdup 中的内存是使用 malloc 创建的,而不是 new.

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

strdup - duplicate a string

The returned pointer can be passed to free(). A null pointer is returned if the new string cannot be created.

P.S。不要在 char *n 的声明中遗漏 const,否则调用者可能认为字符串已被修改,并且无法在没有警告的情况下传递简单字符串文字。

P.S.2:更喜欢使用 nullptr 而不是 0。这已在 SO.

上讨论过多次

is it necessary to free the space in the memory?

是的,避免内存泄漏是必不可少的。

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


此外,您应该避免在 C++ 中自己管理原始指针。要么使用 smart pointers, or standard C++ containers, or for your specific case simply std::string.

原始指针不适合实现 Rule of Three (5/zero).

如果您有从 C 风格接口分配的东西,您始终可以使用智能指针,并提供自定义删除函数,该函数实际上使用适当的 free() 调用。

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

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