我想确认在以下情况下会发生的行为。假设我将一些函数定义为:
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);
};
答案 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>>
可以省去很多麻烦。