如果我使用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时我应该遵循的最佳做法是什么?
谢谢,
陈
答案 0 :(得分:3)
我尝试尽可能在堆栈上分配对象,因为在这种情况下我不必担心释放内存。只有当我明确地想要控制对象的生命周期时,我才会在堆上分配对象。即使对象在堆内部分配内存,您仍然可以在堆栈上创建对象本身。对此没有限制。
答案 1 :(得分:2)
你应该避免在堆栈上创建大尺寸的对象,因为压力下的偶然堆栈溢出(大输入数据)很少通过测试显示出来,因此会让你的最终用户对你的软件崩溃感到不快。
关于字符串和向量以及其他STL容器,您不必担心,因为它们在内部使用动态分配。所以答案是否定的,将它们构造成堆栈是安全的,动态分配它们通常是过度的。
可能有危险的是静态大小的数组,包含诸如boost :: array之类的数组或具有诸如数据成员的类之类的东西。专家经常使用pimpl习语使他们的课程内部动态化。
Stack非常快,但只有在真正有益于性能的地方才能使用它。小心一点比较安全。避免采取危险的习语,如“我在堆栈上分配所有东西”。
答案 2 :(得分:1)
没有;通常,除非变量的生命周期超过函数的生命周期,否则请使用堆栈。
容器类将从堆中分配自己的内存;堆栈中唯一的数据是容器类需要的任何簿记,例如指向头部,大小等的指针。
此外,我建议避免手动新建/删除和使用shared_ptr等技术。