【问题标题】:c++ classes and object referencec++ 类和对象引用
【发布时间】:2013-07-26 08:05:28
【问题描述】:

我有以下 c++ 类

class Object 
{
    public:
        Object(parameters);
 ...
        const Object& method1(parameters) const;
        Object& method2(parameters) const;

    private:
}

method1 和 method2 的实现是:

const Object& Object::method1(parameters) const 
{
...
    Object* _obj = new Object;
...
    return *_obj;
}

Object& Object::method2(parameters) const 
{
...
    Object* _obj = new Object;
...
    return *_obj;
}

我还没有定义复制构造函数。我知道函数返回对分配对象的引用,我仍然必须使用“删除”来删除它。 我想避免浪费内存并保留信息隐藏。

这是执行此操作的正确方法,还是我遗漏了什么?

【问题讨论】:

  • 请在寻求帮助时尝试通过缩进使您的代码可读
  • 为什么不按值返回object?通过返回一个动态分配的实例,你可以获得什么(除非它的生命周期是由创建它的 object 以某种方式管理的)?
  • 尝试删除返回的内容,看看编译器怎么说。
  • “这是正确的做法吗?” - 绝对不是。 “或者我错过了什么?” - 是的,C++ 不是 Java。 “我想避免浪费内存并保留信息隐藏。” - 然后不要将它浪费在动态分配上。

标签: c++ class object


【解决方案1】:

这很糟糕,因为什么都不会删除对象。它们将被泄露。

返回智能指针、不更新对象的副本或原始指针。

【讨论】:

    【解决方案2】:

    这取决于类,但返回一个引用 动态分配的对象可能不是一个好主意。

    • 如果类具有值语义(支持复制和 赋值),你应该返回一个实际的对象;动态的 应避免分配具有值语义的对象。

    • 如果类是一个成熟的实体对象,其生命周期 由应用程序管理,您可能应该返回一个原始的 指针。

    • 如果返回的对象在它之前还需要更多的处理 将由应用程序管理,您可能应该返回 std::auto_ptr,或者如果你可以使用 C++11,std::unique_ptr;这 一旦应用程序逻辑占用,调用者将释放它 结束,如果在此期间发生任何事情,该对象将 自动销毁并释放内存。

    【讨论】:

      【解决方案3】:

      如果您使用的是 C++11,则可以使用 std::unique_ptr<object> 或 std::shared_ptr<object> 作为返回类型(取决于用例)。一旦最后一个智能指针消失,对象就会自动销毁。

      这些类在 boost 中也可用(嗯,std::unique_ptr 映射到 boost::scoped_ptr),以防你的编译器不支持 C++11。如果需要,您也可以使用std::auto_ptr,但它已被 C++11 弃用。

      【讨论】:

      • 按价值返回可能是最好的解决方案,尽管没有更多信息很难说。
      • 是的,可能是也可能不是。我假设 OP 有理由在堆上分配对象。
      • 几乎永远不适合 news 一个对象用 std::shared_ptr 返回它的函数:一旦 shared_ptr 接管了它,你就会在剩下的时间里坚持下去对象生命周期(这很少适用)。
      • 当然,如果对象是可复制的,他根本不应该返回指针。这是或应该是默认值;大约唯一一次你想在 C++ 中动态分配某些东西是因为它是一个具有标识的实体对象,并且通常由应用程序逻辑确定生命周期。 (但即使在强 OO 应用程序中,这样的对象也是少数。)
      • @DarkWanderer:返回shared_ptr 会强制对象在其剩余生命周期内由共享指针管理,这并不总是合适的。相反,您通常应该返回unique_ptr(或auto_ptr,如果您停留在过去)以允许调用者选择如何管理对象:将其保留在返回的指针中,将其转移到共享指针,或释放它以管理其他方式。 (当然,首先假设动态分配是合适的。通常情况下是不合适的。)
      【解决方案4】:

      在这种情况下,您应该使用返回值作为指针 object* object::methodn(parameters) const 或实现复制构造函数,然后返回对象的副本而不是引用,因为当您查看 method1 或 method2 的声明时,您甚至无法想象里面造成了内存泄漏。此外,如果您使用的是 C++11,您可以使用 rvalue reference 使用复制构造函数here's some info on C++11 rvalue references 来减轻内存占用

      【讨论】:

        猜你喜欢
        • 2012-06-27
        • 1970-01-01
        • 2016-05-28
        • 2023-03-21
        • 1970-01-01
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多