在C ++中考虑以下情况:
void Light::setColor(Color* &color, ColorType type)
{
color = new Color(type);
}
我之前是否必须删除可能存储在指针“color”中的值,因为C ++本身并不删除这些对象?我尝试了不同的组合:
delete *&color;
delete &color;
delete &*color;
没有任何作用。
答案 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