0

我一直在学习 c++,但我对向量感到有些困惑。具体来说,如果静态向量在内部实现了一个动态数组,那么当程序结束时,该动态数组正在使用的堆栈内存是否会被释放,或者我应该使用删除操作还是在静态向量上调用析构函数?

4

5 回答 5

3

我应该使用删除操作吗

如果您没有使用 分配有问题的东西new,那么永远不要调用delete它。

或者在静态向量上调用析构函数?

如果您没有使用 placement- 重新初始化事物new,则永远不要显式调用析构函数。

(如果您不是为标准库实现 std::vector 的人,那么您几乎可以肯定永远不需要new自己使用放置。)

全局变量在程序结束时自动清理。

于 2011-12-23T06:35:48.303 回答
1

向量有自己的内部内存管理。这意味着它会分配它认为在创建期间(在其构造函数中)需要的内容,以及在需要时需要的任何额外内存。

当向量被销毁时(它超出范围或程序终止,或者被手动删除),它内部分配的所有内存都会随之删除。

于 2011-12-23T06:28:49.497 回答
0

我不确定你所说的静态向量是什么意思。std::vector 是一个管理可调整大小数组的 STL 容器(参见:http ://www.cplusplus.com/reference/stl/vector/ )。全局上下文中的静态表示文件本地,因此该符号在包含的编译单元之外不可见。类上下文中的 static 主要是一种命名空间技巧,用于创建与类类型关联的全局变量(而不是类实例)。

std::vector 是否为静态与它的实现方式无关。所有 std::vector 实例分配并维护动态分配的 T 的连续数组。vector 的析构函数将删除它先前分配的 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使用的数组,因此不需要删除它。

于 2011-12-23T06:58:36.890 回答
0

向量的析构函数将在程序终止之前被调用。

如果向量持有指向对象的指针,则不会调用它们的析构函数,尽管在大多数平台上,当程序终止时,进程分配的所有内存都会被释放。

于 2011-12-23T06:29:11.560 回答
-2

所有内存都在程序结束时释放。

于 2011-12-23T06:25:01.003 回答