是否可以将“删除”放在逗号表达式中
Posted
技术标签:
【中文标题】是否可以将“删除”放在逗号表达式中【英文标题】:Is it possible to put "delete" in comma expression 【发布时间】:2012-12-30 14:27:21 【问题描述】:我想在指针引用的结构中返回一些材料,然后删除该结构。
在Java中,只要返回值,垃圾回收系统就会自动删除该结构。
但是在 C++ 中,我能想象的方式不是很干净,使用临时变量来存储要返回的东西,删除指针然后返回存储的值。
我尝试了另一种棘手的方法,使用逗号表达式作为“return ptr->value, delete ptr
”,但是有一个编译错误说“void value not ignored as it hould be”。
有什么方法可以更优雅地实现这一点吗?
非常感谢。
更新
非常感谢大家的建议。事实上,我的问题的最初动机是关于我想用于一些较短代码的逗号表达式。而且我发现讨论更多的是关于 C++ 中指针的使用。这也是另一个非常有趣的话题。
我使用 C 多年,所以我对原始指针比较熟悉,而对智能指针的经验很少。在我的第一个想法中,我们需要指针有两个基本条件。一个是引用在堆中分配的一大块内存,另一个是动态分配,例如链接列表节点或树节点(例如,我最初的问题是在编写类似 BST 的结构时出现的)。
那么在 C++ 编程中,智能指针是两种情况的最佳选择吗?如果我们考虑效率,例如在一些低级库上工作,是否可以将原始指针完全封装在类中以减少内存泄漏风险?再次感谢。
【问题讨论】:
【参考方案1】:当然。不要使用指针,如果必须,请使用智能指针(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 并且不会因此受到影响。
【讨论】:
【参考方案2】:不,在您的情况下,因为该函数应该返回一些值,但逗号运算符的计算结果是最右边的操作数,在您的情况下是 delete
表达式,它只是 void
。
【讨论】:
【参考方案3】:通常的解决方案是,首先,不使用指针,这样 一是没什么可删除的,二是有其他资源的时候 被清理,在析构函数中进行清理,这将 在 return 语句被复制后自动被调用 返回值到它必须复制的地方。
如果可以退货,可以复制,所以不应该
动态分配,最值得注意的例外是
涉及多态对象;多态性需要指针
或对工作的引用,并且大多数时候(尽管有
例外),多态对象将是动态的
分配。在这种情况下,如果
多态对象对应局部作用域,可以使用
std::auto_ptr
(或 std::unique_ptr
在不太可能的情况下
你可以依靠 C++11)。
【讨论】:
【参考方案4】:如果在函数内部动态分配指针。你可以做的是:
考虑你想返回一个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;
这样您就不必担心内存泄漏.. 这是最简单的方法。当然你可以使用智能指针。但在你的水平上,我会说坚持这种方法。
【讨论】:
MyStruct obj; return obj.value;
有什么问题?您认为这是给初学者的好建议吗?
语法正确。问题是逗号运算符的类型和返回值是第二个表达式的类型和返回值。并且delete
表达式有一个void
类型并且没有返回值,因此它不能用作return
语句中逗号运算符的最后一个元素,至少在有返回值的情况下是这样。
那么第一个表达式ptr->value
会发生什么?是退货还是什么?
@alfred no 它被逗号运算符丢弃。但是如果函数返回void,这样的return语句是完全正确的。
所以最后一个表达式决定了逗号大小写返回的命运,它是成功还是错误结束以上是关于是否可以将“删除”放在逗号表达式中的主要内容,如果未能解决你的问题,请参考以下文章