使用自动存储的指针应该包含析构函数吗?
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
,而是使用free
。 strdup
中的内存是使用 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*
,但它是完全自我管理的容器。有了它,您将不需要提供复制构造函数或析构函数,因为编译器提供的默认构造函数或析构函数将起作用。
当我创建一个 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
,而是使用free
。 strdup
中的内存是使用 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*
,但它是完全自我管理的容器。有了它,您将不需要提供复制构造函数或析构函数,因为编译器提供的默认构造函数或析构函数将起作用。