【问题标题】: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++ 编程中,智能指针是两种情况的最佳选择吗?如果我们考虑效率,例如在一些低级库上工作,是否可以将原始指针完全封装在类中以减少内存泄漏风险?再次感谢。

【问题讨论】:

    标签: c++ c comma


    【解决方案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语句是完全正确的。
          • 所以最后一个表达式决定了逗号大小写返回的命运,它是成功还是错误结束
          猜你喜欢
          • 1970-01-01
          • 2021-11-26
          • 1970-01-01
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 2020-10-15
          • 1970-01-01
          • 2021-10-19
          相关资源
          最近更新 更多