我一直在学习C++,并且遇到了一些与矢量混淆的问题。具体来说,如果一个静态向量在内部实现了一个动态数组,那么当程序结束时,将释放所述动态数组使用的堆栈内存,还是应该使用删除操作或调用静态向量上的析构函数?是否需要删除静态向量?
回答
所有内存都在程序结束时释放。
一个向量有它自己的内部内存管理。这意味着它在创建时(在其构造函数中)分配它认为需要的内容,以及在需要时它将需要的任何额外内存。
当矢量被破坏(或者超出范围或程序终止,或者被手动删除)时,它在内部分配的所有内存都随之被删除。
该向量的析构函数将在程序终止前调用。
如果矢量持有指向对象的指针,它们的析构函数将不会被调用,尽管在大多数平台上,程序终止时释放了由进程分配的所有内存。
我应该使用删除操作
如果没有使用new
,然后从未呼叫delete
它分配有问题的事情。
或者在静态向量上调用析构函数?
如果您没有使用展示位置定位new
,然后从未调用析构函数明确地重新初始化就地的东西。
(如果你不是谁正在实施的std ::向量标准库的人,那么你几乎肯定会永远不需要使用展示位置定位new
自己,永远。)
全局变量得到清理自动在节目结束。
我不确定静态矢量是什么意思。 std :: vector是一个管理可调整大小数组的STL容器(请参阅:http://www.cplusplus.com/reference/stl/vector/)。全局上下文中的静态意味着本地文件,以便该符号在包含的编译单元之外不可见。在类上下文中的静态主要是一种命名空间技巧,用于创建与类类型(与类实例相对)关联的全局变量。
std :: vector是否是静态的,与它的实现方式无关。所有std :: vector实例分配并维护动态分配的T的连续数组。矢量的析构函数将删除它先前分配的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一个很好的规则++是:
那你新的,你也删除。
既然你没有新的矢量使用的数组,你不需要删除它。
''''''''''''''''''''''''''''''''''''''建议增加:为了让该死的东西异常安全...;) – 2011-12-23 13:19:58
hehe ..我应该注意到我的示例代码存储动态分配的指针一个好的设计,只是说明如果你存储new'd内存,矢量类将不会在你调用v.clear()时为你调用delete。 – 2011-12-23 18:57:49
- 1. 静态后期绑定是否需要重载静态变量?
- 2. 静态变量不需要
- 3. 方法和变量有非静态需要是静态错误
- 4. 私有静态变量是否需要公共setter?
- 5. 总是需要静态
- 6. 当变量是本地时是否需要删除?
- 7. 我是否需要删除此对象?
- 8. 我是否需要删除对象?
- 9. Snow结束后是否需要删除导出的变量
- 10. 是否需要删除指定的变量?
- 11. XCode静态库是否需要与动态库链接?
- 12. 需要澄清C#静态变量
- 13. 是否需要显式删除动态分配容器(比如std ::向量)在用Cython
- 14. 我是否需要处理静态对象内定义的非静态对象?
- 15. 需要删除
- 16. C#LINQ目标需要是静态的
- 17. ConfigurationPropertyCollection需要是静态的吗?
- 18. 在构造函数中访问共享静态变量是否需要同步?
- 19. 需要状态删除功能指导
- 20. 静态转换是否需要执行时间?
- 21. CMake是否需要静态库(例如ZLIB)?
- 22. 我是否需要在.xib文件中发布静态uiviews?
- 23. 静态ConcurrentHashmap是否需要外部同步
- 24. 我是否需要使静态注入的值变化?
- 25. 是否需要在Django中检入静态文件夹?
- 26. 是需要初始化静态变量的构造函数吗?
- 27. 为什么这个变量需要是静态的?
- 28. 是否总是需要删除MapReduce中的重复项?
- 29. 我需要删除矢量吗?
- 30. 需要C++静态方法
当局部变量超出作用域时,它的析构函数会自动调用。 'std :: vector'的析构函数将释放在其存在期间由本地'std :: vector'对象内部分配的任何动态内存。全局对象的析构函数在程序退出之前同样被调用。 – lapk 2011-12-23 06:26:06
提供“静态矢量”的代码示例。静态在C++中意味着很多东西。 # – 2011-12-23 06:33:12