我是c ++的新手,所以问题是基本的。
假设我已经定义了一个类Foo,我在下面的代码中创建了一个向量向量:
namespace testme {
class Foo {
public:
Foo(int x): x_(x) { };
static vector<vector<int>> ReturnVecOfInts(int num) {
vector<vector<int>> ret(num);
for (int i = 0; i < num; i++) {
vector<int> tmp;
ret.push_back(tmp);
}
return ret;
}
}
当我打电话时:
Foo::ReturnVecOfInts(5)
是在堆还是堆栈上创建的向量向量。引用在堆栈上,但我想知道它是否指向堆,因为我想从函数返回此对象。
这对我来说很重要,因为很明显,如果在堆栈上分配这些,则向量向量将超出范围,并且不能在被调用函数之外使用。
答案 0 :(得分:1)
你可能正在思考。
在您的情况下,您可以安全地使用以下代码:
Foo f = Bar::GetFoo();
当您从函数返回对象时,通常会出现各种优化(例如RVO,NRVO等),但最重要的是您的f
对象可以安全使用。
即使在Foo中你有一个像std::vector
这样的数据成员,它通常从堆中分配它的内存(你可以使用自定义分配器自定义这种行为),这要归功于复制构造函数,移动构造函数,析构函数等等。从函数返回它或复制Foo实例是完全安全的。
编辑我注意到您在写完答案后更改了代码,返回vector<vector<int>>
而不是Foo
。同样,我写的内容仍然适用。