当内部内存已经在堆中分配时,我们应该为堆上的对象分配内存吗?

时间:2011-01-04 05:14:16

标签: c++

如果我使用std :: vector<>或者std :: string,我还需要在堆中分配它们吗?例如:

int main() {
    std::vector<int>* p = new std::vector<int>();
    delete p;
}

在Java和C#中,始终使用此语法在堆中分配对象。我想知道在C ++中做同样的事情是否有效?因为无论何时我用C ++创建一个类,我都会在堆栈和堆变量之间进行混合。让我们说:

class simple {
    int a;
    double b;
    std::string c;
    std::vector<int> d;
    ....
};

我想知道在C ++中使用object时我应该遵循的最佳做法是什么?

  • 所有数据都应该在堆上分配?
  • 所有数据都可以混合使用?
  • 或...

谢谢,

3 个答案:

答案 0 :(得分:3)

我尝试尽可能在堆栈上分配对象,因为在这种情况下我不必担心释放内存。只有当我明确地想要控制对象的生命周期时,我才会在堆上分配对象。即使对象在堆内部分配内存,您仍然可以在堆栈上创建对象本身。对此没有限制。

答案 1 :(得分:2)

你应该避免在堆栈上创建大尺寸的对象,因为压力下的偶然堆栈溢出(大输入数据)很少通过测试显示出来,因此会让你的最终用户对你的软件崩溃感到不快。

关于字符串和向量以及其他STL容器,您不必担心,因为它们在内部使用动态分配。所以答案是否定的,将它们构造成堆栈是安全的,动态分配它们通常是过度的。

可能有危险的是静态大小的数组,包含诸如boost :: array之类的数组或具有诸如数据成员的类之类的东西。专家经常使用pimpl习语使他们的课程内部动态化。

Stack非常快,但只有在真正有益于性能的地方才能使用它。小心一点比较安全。避免采取危险的习语,如“我在堆栈上分配所有东西”。

答案 2 :(得分:1)

没有;通常,除非变量的生命周期超过函数的生命周期,否则请使用堆栈。

容器类将从堆中分配自己的内存;堆栈中唯一的数据是容器类需要的任何簿记,例如指向头部,大小等的指针。

此外,我建议避免手动新建/删除和使用shared_ptr等技术。