在使用C ++分配新对象之前,是否必须删除指针后面的对象?

时间:2014-01-26 14:56:05

标签: c++ pointers reference new-operator delete-operator

在C ++中考虑以下情况:

void Light::setColor(Color* &color, ColorType type)
{
    color = new Color(type);
}

我之前是否必须删除可能存储在指针“color”中的值,因为C ++本身并不删除这些对象?我尝试了不同的组合:

delete *&color;
delete &color;
delete &*color;

没有任何作用。

3 个答案:

答案 0 :(得分:2)

 delete color;

将工作并学习如何拼写

答案 1 :(得分:0)

如果你只有这个功能,你不能说是否事先分配了color。 在这两种情况下nullptr都可以使用delete color;或有效指针(因为在调用nullptr时无需测试delete)。

但是你可能会出错(一个非初始化的指针,甚至一个指向堆栈上分配的对象的指针),在这种情况下,delete将会失败。

我建议您使用std::shared_ptr<Color>它会解决您的所有权问题。

void Light::setColor(std::shared_ptr<Color>& color, ColorType type)
{    
    color = std::make_shared<Color>(type);
}

或更好:

std::shared_ptr<Color> Light::setColor(ColorType type)
{    
   return std::make_shared<Color>(type);
}

但按照惯例,以“set”开头的方法应该为内部成员分配内容。 createColor会更好。

答案 2 :(得分:0)

这是一个关于指针的更一般的问题。

当你有一个指向对象的指针时,你正在引用一部分内存。当你删除那个内存时,它就会被释放。

所以,如果你这样做:

color = new Color(...);

您正在为一段内存分配一个Color类型的对象的内容。

因此,您可以通过该指针删除该内存:

delete color;

现在,在这种情况下,*颜色不会太有用:您正在引用对象占用的MEMORY,这不是您想要的。

让我们再看一个例子:如果你有一个简单的对象,说一个字符数组:

char *str = new char[200];

然后指针str指向实例化对象,*str指向对象占用的内存内容。在这种情况下,指针本身并不是你想要的:你对存储在该内存块中的实际数据感兴趣(即一串字符)。

因此,delete[] str;将删除str指向的内存块。 delete[] *str;没有多大意义。

所以,如果我们尝试使用printf():

char *str = new char[200];
strcpy(str, "test");
printf("The variable's contents are: %s", str); // will print the string itself
printf("The variable's address is: %p", str);   // will print the address of the string in memory

这是一个关于指针的有用链接,可以清除一些内容: http://courses.washington.edu/css342/zander/css332/pointers.html

相关问题