7

我试图找出最好的方法来保存指向刚刚创建并添加到成员变量向量中的向量中的元素的指针:

  SceneGraphNode* addChild(std::string name){
    SceneGraphNode child(this,name);
    m_children.push_back(child);
    return &child;
}

编译器正确地给了我一个警告,因为我正在返回在堆栈上创建的对象的地址,并且该对象将在函数结束时超出范围。但是,对象仍然存在于 中vector,对吗?

那么,我应该忽略警告还是有更好的方法来做到这一点?

4

4 回答 4

11

但是,对象仍然存在于向量中,对吗?

不,它的副本确实如此。您要返回副本的地址。

return &m_children.back();

但是,存储指向驻留在向量中的对象的指针并不是一个好主意。因为当vector需要重新分配时,指针就会失效。也许您应该将指针(最好是智能指针)存储在向量中。

例如:

// in your class
std::vector<std::unique_ptr<SceneGraphNode>> m_children;

SceneGraphNode* addChild(std::string name)
{
    std::unique_ptr<SceneGraphNode> child(new SceneGraphNode(this,name));
    m_children.push_back(std::move(child));
    return m_children.back().get();
}
于 2013-05-06T02:54:10.847 回答
0

将其添加到 std::vector 时,您实际上是在进行复制。您应该返回对存储在向量中的对象的引用。

return &(m_children.back());
于 2013-05-06T02:54:41.567 回答
0

该对象并不完全存在于向量中,因为当您使用push_back它时,您正在制作该元素的副本

如果您通过类似的方式更改返回值,则此代码可以工作(Ryan 的形式实际上更简单):

return &m_children[m_children.size() - 1];

这样,您就有效地返回了一个指向存在于您的向量中的元素的指针。

于 2013-05-06T02:54:46.650 回答
0

但是,对象仍然存在于向量中,对吗?

当您推入向量时,它实际上将copies对象而不是对象本身推入向量中。STL 容器可以copy in, copy out。但是,正如编译器所指出的,您不应该return the address of an object created on the stack.

于 2013-05-06T02:54:27.687 回答