物体何时被摧毁?

时间:2012-11-02 12:49:23

标签: c++ oop class object

我想确认在以下情况下会发生的行为。假设我将一些函数定义为:

std::vector<Object*> FuncA()
Result FuncB()

其中result是一个带有构造函数的类

Result(const std::vector<Object*>& result)
{
    this->result = result;
}

现在,FuncB执行以下操作:

Result FuncB() {
 ... some stuff here ...
return Result(FuncA())
}

FuncA返回的向量何时被销毁(已经调用了析构函数)?结果超出范围时会不会是这样?持有对它的引用的结果是否延长了它的寿命?如果没有,你能否解释为什么,也许是一种方法来实现我的目标?

由于

编辑:这是结果类

class Result
    {
    private:
        std::vector<Object*> result;

        void SetData(const Result& other);
        void Free();

        // Constructs the result and takes ownership of the memory.
        Result(const std::vector<Object*>& result);

        Result();

    public:
        Result(const Result& other);
        Result& operator=(const Result& rhs);
        ~Result();

        const Object& operator [] (int index);
    };

2 个答案:

答案 0 :(得分:2)

如果Result拥有引用,则表示您遇到了问题。 <{1}}返回的对象将在返回FuncA对象之前销毁。

现在,Result按值保存。这意味着Result的返回值将被复制到构造函数中。当FuncA对象为。

时,矢量将被销毁

如果您想避免复制,take the object by value in the constructor

Result

或者,如果你不使用C ++ 11(参见@Steve Jessop的评论)

Result(std::vector<Object*> result) 
    : result(std::move(result))
{}

答案 1 :(得分:1)

这很可能是做你想做的事情的错误方法。 Result超出范围时,向量将被销毁。向量中的指针所指向的内存不会。

所以你可以返回一个向量并仍然使用它,但是如果释放了该向量副本中的指针,你将会遇到UB。

改为std::vector<std::shared_ptr<Object>>可以省去很多麻烦。