C++/析构函数-运算符删除
C++ / destructor - operator delete
我想知道是否必须删除以下示例中的指针:
class Person
{
public:
Person(char *name) :_name(name) {}
// Is this delete necessary?
~Person() {
cout<<"Godbay Person"<<endl;
delete _name;
}
private:
char * _name;
}
无论如何,这肯定是错误的。
有两种可能性:
-
名称是在免费存储中专门为您的对象创建的,您的对象必须拥有所有权。然后必须删除该名称。
-
该名称不是在免费存储上创建的(例如,作为字符串litral,这是很可能的),或者其他对象正在管理该名称,因此您的对象不应承担所有权。然后任何删除都会对你的程序造成严重破坏。
那么,为什么即使在第一种情况下我也会说错呢?因为name
听起来像一个字符串,而不是单个字符,这意味着name*
将指向一个动态分配的字符数组。在这种情况下,删除它的正确方法是delete[] name
。
但是:如果可能,对于情况1,请避免使用纯(char)指针。使用一些内存管理类(字符串类或智能指针)来解决手动管理内存所有权的难题。delete
和delete[]
应该很少出现在代码中,除非您无法访问最新的C++编译器。
这是谁拥有分配的内存的问题,在这种情况下,看起来Person没有拥有它,所以没有,所以没有必要删除。像在Person
中那样使用原始指针总是会引发所有权问题,这就是为什么建议使用shared_ptr/unique_ptr
,甚至更好的std::string
,因为它似乎是一个字符串。
通常,每次使用new创建指针时都必须调用delete。
这取决于创建过程。
在这种情况下,否:
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字符串指针。
相关文章:
- 编译"运算符删除"时C++编译器如何工作?
- 删除 x 与 ::运算符删除 (x)
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- 为什么在运算符删除中不调用析构函数?
- 如何在 C++ 中使用删除运算符删除单个数据
- C++对自动(堆栈)指针使用运算符删除
- C++运算符删除覆盖并不总是使用
- 带大小参数和不带大小参数的"运算符删除":当两者都可用时,选择哪一个?
- C++ 运算符删除重载对派生类不起作用
- 无法覆盖C++中纯抽象类中的运算符删除/新建
- 对运算符删除覆盖的工作方式感到困惑
- C++/析构函数-运算符删除
- C++can运算符删除失败,如果不是原因
- 如果我写一个新的展示位置?我应该如何编写普通运算符删除
- 删除与运算符删除(和无效指针)
- 使用单个删除运算符删除多个指针
- 如何实现 C "classes" 的 C++11 冒名顶替者的运算符删除?
- shared_ptr-运算符删除中的访问冲突
- 使用delete运算符删除结构中的元素
- 内存管理 - 目标 C++ 运算符删除