我想知道是否必须在示例中删除此指针,如下所示:
class Person
{
public:
Person(char *name) :_name(name) {}
// Is this delete necessary?
~Person() {
cout<<"Godbay Person"<<endl;
delete _name;
}
private:
char * _name;
}
答案 0 :(得分:1)
这是谁拥有分配的内存的问题,在这种情况下,看起来像人不拥有它所以没有,所以没有必要删除。像Person
中一样使用原始指针总会引起有关所有权的问题,这就是为什么建议使用shared_ptr/unique_ptr
代替甚至更好std::string
,因为它似乎是一个字符串。
答案 1 :(得分:1)
无论如何,这肯定是错误的。
有两种可能性:
该名称是专门为您的对象在免费商店中创建的,您的对象必须承担所有权。然后必须删除该名称。
该名称不是在免费商店中创建的(例如,作为字符串litaral,这很可能),或者其他一些对象正在管理名称,因此您的对象不应该拥有所有权。然后任何删除都会对你的程序造成严重破坏。
那么为什么即使在第一种情况下我也说错呢?因为name
听起来像一个字符串,而不是一个字符,这意味着name*
将指向一个动态分配的字符数组。在这种情况下,删除它的正确方法是delete[] name
。
但是:如果可能的话,避免使用普通(字符串)指针,对于案例1.使用一些内存管理类(字符串类或智能指针)来获取摆脱手动管理内存所有权的麻烦。除非您无法访问最新的C ++编译器,否则delete
和delete[]
应该很少出现在您的代码中。
答案 2 :(得分:0)
通常,每次使用new创建指针时都必须调用delete。
答案 3 :(得分:0)
这取决于创建程序。
在这种情况下没有:
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字符串指针。