我一直在学习c ++,而且我遇到了一些与向量混淆的问题。具体来说,如果静态向量在内部实现动态数组,那么当程序结束时是否会释放所述动态数组使用的堆栈内存,还是应该使用delete操作或在静态向量上调用析构函数?
答案 0 :(得分:3)
我应该使用删除操作
如果您未使用new
分配相关内容,则永远不会在其上调用delete
。
或在静态向量上调用析构函数?
如果您没有使用展示位置new
重新初始化该内容,则永远不会明确调用析构函数。
(如果您不是为标准库实现std :: vector的人,那么您几乎肯定永远不需要自己使用展示位置 - new
。)
全局变量在程序结束时自动清理。
答案 1 :(得分:1)
向量具有自己的内部内存管理。这意味着它在创建过程中(在构造函数中)分配它认为需要的东西,以及在需要它时需要的任何额外内存。
当向量被破坏时(无论是超出范围还是程序终止,或者手动删除),内部分配的所有内存都会随之被删除。
答案 2 :(得分:0)
在程序终止之前将调用向量的析构函数。
如果向量持有指向对象的指针,则不会调用它们的析构函数,但是在大多数平台上,当程序终止时,所有由进程分配的内存都将被释放。
答案 3 :(得分:0)
我不确定静态向量是什么意思。 std :: vector是一个管理可调整大小的数组的STL容器(参见:http://www.cplusplus.com/reference/stl/vector/)。全局上下文中的static表示文件本地,以便符号在包含的编译单元外部不可见。类上下文中的static主要是一个命名空间技巧,用于创建与类类型相关联的全局变量(而不是类实例)。
std :: vector是否静态与它的实现方式无关。所有std :: vector实例都分配并维护动态分配的连续T数组.veve的析构函数将删除它之前分配的T数组。你既不需要分配或释放这个内存,也不需要知道它正在发生。如果你的std :: vector实例是静态的,那么在main()退出后会调用它的析构函数。如果它被分配在堆栈上,它的析构函数将在超出范围时被调用。如果你打电话
std::vector<T>* p = new std::vector<T>();
您将负责致电
delete p;
在p超出范围之前。
最后,如果您的向量本身包含动态分配的指针,您也将负责删除它们。
// Not exception safe code!
std::vector<int*> v;
v.push_back(new int(4));
v.push_back(new int(5));
std::cout << *v[0] << ", " << *v[1] << std::endl;
for (auto iter = v.begin(); iter != v.end(); ++iter) {
delete *iter;
}
v.clear();
C / C ++中的一个好的经验法则是:
你新的,你也删除。
由于你没有使用vector使用的数组,所以你不需要删除它。
答案 4 :(得分:-1)
所有内存都在程序结束时释放。