1

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

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);
    };
4

2 回答 2

2

如果Result持有参考,那么你就有问题了。返回的对象FuncA将在对象返回之前被销毁Result

现在,Result按价值持有。这意味着 的返回值FuncA将被复制到构造函数中。当Result对象存在时,向量将被销毁。

如果要避免复制,请在构造函数中按值获取对象

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

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

Result(std::vector<Object*> result) 
{
    this->result.swap (result);
}
于 2012-11-02T12:51:48.463 回答
1

这很可能是做你想做的事情的错误方法。当Result超出范围时,向量会被破坏。向量中的指针指向的内存没有。

因此,您可以返回一个向量并仍然使用它,但如果该向量副本中的指针被释放,您将遇到 UB。

有一个std::vector<std::shared_ptr<Object>>代替会为你省去很多麻烦。

于 2012-11-02T12:52:25.700 回答