3

我有以下 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;
}

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

这是这样做的正确方法,还是我错过了什么?

4

4 回答 4

4

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

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

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

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

于 2013-07-26T08:19:27.193 回答
4

这很糟糕,因为没有任何东西会删除对象。它们将被泄露。

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

于 2013-07-26T08:12:08.897 回答
2

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

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

于 2013-07-26T08:12:22.100 回答
1

在这种情况下,您应该使用返回值作为指针object* object::methodn(parameters) const或实现复制构造函数,然后返回不是引用而是对象的副本,因为当您查看声明时,method1method2甚至无法想象创建了内存泄漏里面。此外,如果您使用的是 C++11,则可以rvalue reference使用复制构造函数来减轻内存占用,这是有关 C++11 右值引用的一些信息

于 2013-07-26T08:10:14.570 回答