我想在指针引用的结构体中返回一些材料,然后删除结构体。
在Java中,只要返回该值,垃圾回收系统就会自动删除该结构体。
但是在c++中,我可以想象的方式不是很干净,使用一个临时变量来存储要返回的东西,删除指针,然后返回存储的值。
我尝试了另一种棘手的方法,使用逗号表达式作为"return ptr->value, delete ptr
",但是有一个编译错误说&;void值没有被忽略,因为它应该"。
是否有可能更优雅地实现这一点?
谢谢你。
更新
非常感谢大家的建议。事实上,我的问题的最初动机是关于逗号表达式,我想使用一些较短的代码。我发现讨论更多的是关于c++中指针的用法。这也是另一个非常有趣的话题。
我已经使用C多年了,所以我对原始指针更熟悉,对智能指针的经验很少。在我的第一个想法,有两个基本的条件,我们需要指针。一种是引用在堆中分配的大块内存,另一种是动态分配,如链表节点或树节点(例如。我最初的问题是在编写类似bst的结构体时出现的)。
所以在c++编程中,智能指针是两种情况下的最佳选择吗?如果我们考虑效率,例如在一些低级库上工作,是否有可能将原始指针完全封装在类中以减少内存泄漏风险?
当然。不要使用指针,如果必须的话,使用智能指针(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
您可能无法想象在c++中用干净的方式来完成它,因为c++是作为C来教授的,存在指针和内存管理问题。正确的c++使用RAII,不会受到这个问题的困扰。
不,在您的情况下,因为函数应该返回一些值,但是逗号操作符计算到最右边的操作数,在您的情况下是delete
表达式,这只是void
。
通常的解决方案是,首先,不使用指针,以便有没有什么可以删除的,其次,当有其他资源时要被清理,在析构函数中进行清理,这将在返回语句复制后自动调用将返回值复制到需要复制的位置。
如果你可以返回它,你就可以复制它,所以它不应该是动态分配,最明显的例外是涉及多态对象;多态性需要指针或者提到工作,大多数时候(尽管有)异常),多态对象将是动态的分配。在这种情况下,如果的实际生命周期多态对象对应局部作用域,可以使用std::auto_ptr
(或std::unique_ptr
在不太可能的情况下)
如果在函数内部动态分配指针。你可以做的是:
考虑您想返回一个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;
}
这样你就不用担心内存泄漏了。这是最简单的方法。当然,你可以使用智能指针。但是对于你的水平,我会建议你继续使用这个方法