是否可以将“删除”放在逗号表达式中

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_ptrstd::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语句是完全正确的。 所以最后一个表达式决定了逗号大小写返回的命运,它是成功还是错误结束

以上是关于是否可以将“删除”放在逗号表达式中的主要内容,如果未能解决你的问题,请参考以下文章

c语言这个逗号表达式的结果是啥,为啥?

什么正则表达式将匹配除逗号','或分号';'之外的每个字符?

使用正则表达式从逗号分隔列表中删除重复项 [重复]

Bigquery 正则表达式 - 删除双引号中的逗号

重载逗号表达式

正则表达式从逗号分隔列表中删除连续重复(整数和/或浮点数)