C++ 有没有可能把;删除“;用逗号表示

C++ 有没有可能把;删除“;用逗号表示,c++,c,comma,C++,C,Comma,我想返回指针引用的结构中的一些材料,然后删除该结构 在Java中,只要返回该值,垃圾收集系统就会自动删除该结构 但是在C++中,我可以想象的方式不是很干净,使用一个临时变量来存储返回的东西,删除指针,然后返回存储的值。p> 我尝试了另一种巧妙的方法,使用逗号表达式作为“返回ptr->value,删除ptr”,但是出现了一个编译错误,上面写着“void value未被忽略” 有没有可能更优雅地做到这一点 非常感谢 更新 非常感谢大家的建议。事实上,我的问题的最初动机是关于逗号表达式,我想用它来编

我想返回指针引用的结构中的一些材料,然后删除该结构

在Java中,只要返回该值,垃圾收集系统就会自动删除该结构

<>但是在C++中,我可以想象的方式不是很干净,使用一个临时变量来存储返回的东西,删除指针,然后返回存储的值。p> 我尝试了另一种巧妙的方法,使用逗号表达式作为“
返回ptr->value,删除ptr
”,但是出现了一个编译错误,上面写着“void value未被忽略”

有没有可能更优雅地做到这一点

非常感谢


更新

非常感谢大家的建议。事实上,我的问题的最初动机是关于逗号表达式,我想用它来编写一些较短的代码。我发现讨论更多的是C++中指针的用法。这也是另一个非常有趣的话题

我已经使用C语言很多年了,所以我更熟悉原始指针,对智能指针几乎没有经验。我的第一个想法是,有两个基本条件需要指针。一个是对堆中分配的一大块内存的引用,另一个是用于动态分配,例如链接列表节点或树节点(例如,我最初的问题是在编写类似BST的结构时出现的)


<> P>在C++程序设计中,智能指针是两种情况下的最佳选择吗?如果我们考虑效率,例如在一些低级库上工作,是否可以将原始指针封装在类内以减少内存泄漏风险?再次感谢。

不,在您的情况下,因为函数应该返回一些值,但逗号运算符的计算结果是最右边的操作数,在您的情况下是
delete
表达式,它只是
void
确定。不要使用指针,如果必须,请使用智能指针(
std::shared_ptr
std::unique_ptr

在您的情况下,它可以简单到

//...
return obj.value;  //no pointer needed
                   //automatic memory management


<>你可能无法想象C++中的干净方式,因为C++被教成C,带有指针和内存管理问题。适当的C++使用<强> RAII/St>,不受此影响。如果在函数内动态地分配指针,则

< P>。您可以做的是:

假设您想要返回一个
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;
}
这样,您就不必担心内存泄漏。。
这是最简单的方法。当然你可以使用智能指针。但是在你的级别上,我会说坚持使用这种方法。

通常的解决方案是,首先,不使用指针,这样 没有什么可删除的,第二,当有其他资源时 要清理,请在析构函数中执行清理,这将 在复制return语句后自动调用 将返回值复制到需要复制的位置

如果你能退回它,你可以复制它,所以它不应该是 动态分配,最显著的例外是 涉及多态对象;多态性需要指针 或参考工作,大多数情况下(尽管有 异常),多态对象将动态地 分配。在这种情况下,如果 多态对象对应于局部范围,可以使用
std::auto_ptr
(或
std::unique_ptr
,在不太可能的情况下
你可以指望C++11)。

MyStruct obj有什么问题;返回对象值?你认为这是给初学者的好建议吗?语法是正确的。问题是逗号运算符的类型和返回值与第二个表达式的类型和返回值相同。而
delete
表达式的类型为
void
且没有返回值,因此它不能用作
return
语句中逗号运算符的最后一个元素,至少在有返回值的情况下是如此。那么第一个表达式
ptr->value
会发生什么情况呢?它是返回的还是什么?@alfred no它被逗号运算符丢弃。但是如果函数返回void,那么这样的return语句是完全正确的。因此,在逗号情况下,最后一个表达式决定了返回的命运,即它是成功的还是以错误告终
int foo()
{
  MyStruct obj;

  obj=new MyStruct;

  .....

  return obj.value;
}