当我创建一个类,在其中包含一个指针,并在自动存储中创建一个对象时,我应该在类中包含一个析构函数吗? (是否有必要释放内存中的空间?) 例如:
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);
答案 0 :(得分:4)
是否有必要释放内存中的空间?
是的,避免内存泄漏至关重要。
无论如何,您必须在示例中使用free(name);
,因为strdup()
是纯C函数,并使用malloc()
函数为返回的副本分配内存。
此外,您应该避免在C ++中自己管理原始指针。使用smart pointers或standard 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
,而是使用free
。 strdup
中的内存是使用malloc
而不是new
创建的。
http://pubs.opengroup.org/onlinepubs/009695399/functions/strdup.html
strdup - 复制字符串
返回的指针可以传递给 free()。空指针是 如果无法创建新字符串,则返回。
P.S。不要在const
的声明中错过char *n
,否则调用者可能会期望字符串被修改,并且在没有警告的情况下不能传递简单字符串文字。
P.S.2:首选使用nullptr
代替0
。这已在SO上多次讨论过。