Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中分配新对象之前,是否必须删除指针后面的对象+;?_C++_Pointers_Reference_New Operator_Delete Operator - Fatal编程技术网

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; 将工作并学习如何拼写 将工作并学习

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

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不会太有用:您引用的是对象占用的内存,而这并不是什么