C++ 在C+中分配新对象之前,是否必须删除指针后面的对象+;?
在C++中考虑以下情况:C++ 在C+中分配新对象之前,是否必须删除指针后面的对象+;?,c++,pointers,reference,new-operator,delete-operator,C++,Pointers,Reference,New Operator,Delete Operator,在C++中考虑以下情况: void Light::setColor(Color* &color, ColorType type) { color = new Color(type); } 我必须删除以前在指针“颜色”中存储的值,因为C++本身不删除这些对象吗?我尝试过不同的组合: delete *&color; delete &color; delete &*color; 什么都不管用 delete color; 将工作并学习如何拼写 将工作并学习
void Light::setColor(Color* &color, ColorType type)
{
color = new Color(type);
}
<>我必须删除以前在指针“颜色”中存储的值,因为C++本身不删除这些对象吗?我尝试过不同的组合:
delete *&color;
delete &color;
delete &*color;
什么都不管用
delete color;
将工作并学习如何拼写
将工作并学习如何拼写
将工作并学习如何拼写
将工作并学习如何拼写如果您只有此功能,则无法说明是否事先分配了
颜色
。
在这两种情况下,您可能都有nullptr
或有效指针delete color
将起作用(因为调用delete
时无需测试nullptr
)
但是您可能会得到一些错误(一个未初始化的指针,甚至是指向堆栈上分配的对象的指针),在这种情况下,delete将失败
我建议您使用std::shared\u ptr
它将解决您的所有权问题
void Light::setColor(std::shared_ptr<Color>& color, ColorType type)
{
color = std::make_shared<Color>(type);
}
void Light::setColor(std::shared_ptr&color,ColorType)
{
颜色=标准::使共享(类型);
}
或者更好:
std::shared_ptr<Color> Light::setColor(ColorType type)
{
return std::make_shared<Color>(type);
}
std::shared_ptr Light::setColor(ColorType)
{
返回标准::使_共享(类型);
}
但按照惯例,以“set”开头的方法应该将某些内容分配给内部成员
createColor
会更好。如果您只有此功能,则无法说明是否事先分配了color
。
在这两种情况下,您可能都有nullptr
或有效指针delete color
将起作用(因为调用delete
时无需测试nullptr
)
但是您可能会得到一些错误(一个未初始化的指针,甚至是指向堆栈上分配的对象的指针),在这种情况下,delete将失败
我建议您使用std::shared\u ptr
它将解决您的所有权问题
void Light::setColor(std::shared_ptr<Color>& color, ColorType type)
{
color = std::make_shared<Color>(type);
}
void Light::setColor(std::shared_ptr&color,ColorType)
{
颜色=标准::使共享(类型);
}
或者更好:
std::shared_ptr<Color> Light::setColor(ColorType type)
{
return std::make_shared<Color>(type);
}
std::shared_ptr Light::setColor(ColorType)
{
返回标准::使_共享(类型);
}
但按照惯例,以“set”开头的方法应该将某些内容分配给内部成员
createColor
会更好。如果您只有此功能,则无法说明是否事先分配了color
。
在这两种情况下,您可能都有nullptr
或有效指针delete color
将起作用(因为调用delete
时无需测试nullptr
)
但是您可能会得到一些错误(一个未初始化的指针,甚至是指向堆栈上分配的对象的指针),在这种情况下,delete将失败
我建议您使用std::shared\u ptr
它将解决您的所有权问题
void Light::setColor(std::shared_ptr<Color>& color, ColorType type)
{
color = std::make_shared<Color>(type);
}
void Light::setColor(std::shared_ptr&color,ColorType)
{
颜色=标准::使共享(类型);
}
或者更好:
std::shared_ptr<Color> Light::setColor(ColorType type)
{
return std::make_shared<Color>(type);
}
std::shared_ptr Light::setColor(ColorType)
{
返回标准::使_共享(类型);
}
但按照惯例,以“set”开头的方法应该将某些内容分配给内部成员
createColor
会更好。如果您只有此功能,则无法说明是否事先分配了color
。
在这两种情况下,您可能都有nullptr
或有效指针delete color
将起作用(因为调用delete
时无需测试nullptr
)
但是您可能会得到一些错误(一个未初始化的指针,甚至是指向堆栈上分配的对象的指针),在这种情况下,delete将失败
我建议您使用std::shared\u ptr
它将解决您的所有权问题
void Light::setColor(std::shared_ptr<Color>& color, ColorType type)
{
color = std::make_shared<Color>(type);
}
void Light::setColor(std::shared_ptr&color,ColorType)
{
颜色=标准::使共享(类型);
}
或者更好:
std::shared_ptr<Color> Light::setColor(ColorType type)
{
return std::make_shared<Color>(type);
}
std::shared_ptr Light::setColor(ColorType)
{
返回标准::使_共享(类型);
}
但按照惯例,以“set”开头的方法应该将某些内容分配给内部成员
createColor
会更好。这是一个关于指针的更一般的问题
当您有一个指向对象的指针时,您引用的是内存的一部分。当您删除该内存时,它将被释放
因此,如果你这样做:
color = new Color(...);
您正在使用Color类型的对象的内容分配一段内存
因此,您可以通过该指针删除该内存:
delete color;
现在,在本例中,*color不会太有用:您引用的是对象占用的内存,这不是您想要的
让我们再举一个例子:如果你有一个简单的对象,比如一个字符数组:
char *str = new char[200];
然后指针str
指向实例化的对象,*str
指向该对象占用的内存内容。在这种情况下,指针本身并不是您想要的:您对存储在该内存块中的实际数据(即字符串)感兴趣
因此,delete[]str
将删除str指向的内存块<代码>删除[]*str代码>没有多大意义
因此,如果我们使用printf()尝试此操作:
这里有一个关于指针的有用链接,可以澄清一些问题:
这是一个关于指针的更一般的问题 当您有一个指向对象的指针时,您引用的是内存的一部分。当您删除该内存时,它将被释放 因此,如果你这样做:
color = new Color(...);
您正在使用Color类型的对象的内容分配一段内存
因此,您可以通过该指针删除该内存:
delete color;
现在,在本例中,*color不会太有用:您引用的是对象占用的内存,而这并不是什么