2011-12-23 86 views
0

我一直在学习C++,并且遇到了一些与矢量混淆的问题。具体来说,如果一个静态向量在内部实现了一个动态数组,那么当程序结束时,将释放所述动态数组使用的堆栈内存,还是应该使用删除操作或调用静态向量上的析构函数?是否需要删除静态向量?

+1

当局部变量超出作用域时,它的析构函数会自动调用。 'std :: vector'的析构函数将释放在其存在期间由本地'std :: vector'对象内部分配的任何动态内存。全局对象的析构函数在程序退出之前同样被调用。 – lapk 2011-12-23 06:26:06

+2

提供“静态矢量”的代码示例。静态在C++中意味着很多东西。 # – 2011-12-23 06:33:12

回答

-1

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

1

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

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

0

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

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

3

我应该使用删除操作

如果没有使用new,然后从未呼叫delete它分配有问题的事情。

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

如果您没有使用展示位置定位new,然后从未调用析构函数明确地重新初始化就地的东西。

(如果你不是谁正在实施的std ::向量标准库的人,那么你几乎肯定会永远不需要使用展示位置定位new自己,永远。)

全局变量得到清理自动在节目结束。

0

我不确定静态矢量是什么意思。 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一个很好的规则++是:

那你新的,你也删除。

既然你没有新的矢量使用的数组,你不需要删除它。

+0

''''''''''''''''''''''''''''''''''''''建议增加:为了让该死的东西异常安全...;) – 2011-12-23 13:19:58

+0

hehe ..我应该注意到我的示例代码存储动态分配的指针一个好的设计,只是说明如果你存储new'd内存,矢量类将不会在你调用v.clear()时为你调用delete。 – 2011-12-23 18:57:49