c ++类和对象引用

时间:2013-07-26 08:05:29

标签: c++ class object

我有以下c ++类

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

    private:
}

method1method2实现是:

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

返回智能指针,不重新创建对象的副本或原始指针。

答案 1 :(得分:4)

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

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

  • 如果该类是一个完整的实体对象,其生命周期 由应用程序管理,你应该返回一个raw 指针。

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

来缓解内存