我想在指针引用的结构中返回一些材料然后删除结构。
在Java中,只返回值,垃圾收集系统将自动删除结构。
但是在C ++中,我可以想象的方式并不是很干净,即使用临时变量存储要返回的东西,删除指针然后返回存储的值。
我尝试使用逗号表达式作为“return ptr->value, delete ptr
”的另一种棘手的方法,但是有一个编译错误说“无法忽略空值,因为它应该是”。
有没有办法更优雅地实现这一目标?
非常感谢。
更新
非常感谢大家的建议。事实上,我的问题的原始动机是关于逗号表达式,我想用它来做一些较短的代码。我发现讨论更多的是关于C ++中指针的使用。这也是另一个非常有趣的话题。
我已经使用了C多年,所以我对原始指针更熟悉,并且对智能指针几乎没有经验。我首先想到的是,我们需要指针的基本条件有两个。一个是引用堆中分配的大块内存,另一个是动态分配,例如链接列表节点或树节点(例如,在编写类似BST的结构时出现了我的原始问题)。
那么在C ++编程中,智能指针是两种情况的最佳选择吗?如果我们考虑效率,例如在一些低级库上工作,是否可以将原始指针完全封装在类中以减少内存泄漏风险?再次感谢。
答案 0 :(得分:4)
不确定。不要使用指针,如果必须,请使用智能指针(std::shared_ptr
,std::unique_ptr
)。
在您的情况下,它可以像
一样简单//...
return obj.value; //no pointer needed
//automatic memory management
或
//...
return smartPtr->value; //smart pointer automatically cleans up after itself
你可能无法想象 clean 在C ++中这样做的方式,因为C ++被教导为C,带有指针和内存管理问题。正确的C ++使用 RAII 并且不会受此影响。
答案 1 :(得分:2)
不,在你的情况下,因为函数应该返回一些值,但是逗号运算符求值为最右边的操作数,在你的情况下是delete
表达式,它只是void
。
答案 2 :(得分:2)
通常的解决方案是,首先,不要使用指针,以便那里 没有什么可以删除,其次,当有其他资源时 要清理,在析构函数中进行清理,这将是 在复制return语句后自动调用 返回值到必须复制的地方。
如果你可以退货,你可以复制它,所以它不应该
动态分配,最值得注意的例外是哪里
涉及多态对象;多态性需要指针
或者提到工作,大多数时候(虽然有
异常),多态对象将是动态的
分配。在这种情况下,如果实际的寿命
多态对象对应本地范围,可以使用
std::auto_ptr
(或std::unique_ptr
,在不太可能的情况下
你可以信赖C ++ 11)。
答案 3 :(得分:1)
如果在函数内动态分配指针。你能做的是:
考虑您要返回int
变量
int foo()
{
MyStruct *obj;
obj=new MyStruct;
.....
int x=obj->value;
delete obj;
return x;
}
或者您也可以这样做:
int foo()
{
MyStruct obj;
obj=new MyStruct;
.....
return obj.value;
}
这样你就不必担心内存泄漏了......
这是最简单的方法。当然你可以使用智能指针。但在你的水平上,我会说坚持这种方法。