是在不使用堆栈或堆上分配的“new”的情况下分配的对象

时间:2016-10-12 17:27:45

标签: c++

我是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)

是在堆还是堆栈上创建的向量向量。引用在堆栈上,但我想知道它是否指向堆,因为我想从函数返回此对象。

这对我来说很重要,因为很明显,如果在堆栈上分配这些,则向量向量将超出范围,并且不能在被调用函数之外使用。

1 个答案:

答案 0 :(得分:1)

你可能正在思考。

在您的情况下,您可以安全地使用以下代码:

Foo f = Bar::GetFoo();

当您从函数返回对象时,通常会出现各种优化(例如RVO,NRVO等),但最重要的是您的f对象可以安全使用。

即使在Foo中你有一个像std::vector这样的数据成员,它通常从堆中分配它的内存(你可以使用自定义分配器自定义这种行为),这要归功于复制构造函数,移动构造函数,析构函数等等。从函数返回它或复制Foo实例是完全安全的。

编辑我注意到您在写完答案后更改了代码,返回vector<vector<int>>而不是Foo。同样,我写的内容仍然适用。