我刚才有一个关于在c ++中编程时使用向量的快速问题。如果你创建了一个向量,你需要在程序关闭之前将其清除或删除它,还是删除向量并在关闭程序时释放内存?
由于
史蒂芬
答案 0 :(得分:0)
这取决于你如何宣告你的载体。
std::vector<...> myVec;
)std::vector<...>* myVec = new std::vector<...>();
)在第一种情况下,您不必执行任何操作,因为只要向量超出范围(应用程序终止时总是如此),将调用其析构函数并清除其ressoruces。
在第二种情况下,你必须调用delete myVec;
所以1)向量变得未初始化(与第一种情况相同,析构函数被调用等)和2)向量的内存被释放。< / p>
答案 1 :(得分:0)
如果您只是声明一个向量,例如
std::vector<int> vec;
它具有自动存储持续时间,当析构函数超出范围时将调用析构函数。
如果您使用过new
,则应使用delete
。
答案 2 :(得分:0)
如果你没有用new
创建它(通常你不应该这样做),那么就没有必要做任何事了。它将在其生命周期结束时自动销毁,析构函数将自动释放其内存。
如果您使用new
创建了它,那么为了良好的顺序,您应确保在程序结束前删除它。如果不这样做,那么大多数现代操作系统都会释放内存;但允许它泄漏可能会使追踪有问题的泄漏变得更加困难,并可能导致异国情调的操作系统出现问题。
在任何一种情况下,都没有必要清除它;析构函数会为你做到这一点。
答案 3 :(得分:0)
您的问题涉及两个不同的事情。程序中的操作系统和对象的生命
操作系统部分:一般来说,在现代操作系统中,您无需执行任何操作。任何体面的现代操作系统都会在进程结束后对内存进行处理。甚至动态分配/请求。
这就是为什么Windows 95会随着时间的推移而出现故障和不稳定的原因之一。它没有这样做。因此,如果应用程序泄漏了内存(并且应用程序确实并且几乎一直在执行它),那么它将永久地被占用。
c ++ :现在,当您拥有现代c ++容器以及设计良好且实现良好的对象时,它们都具有编写的析构函数。所以他们礼貌而善良,他们释放自己的记忆。它们基本上在两个条件下被破坏。如果你不动态分配它,例如via new
编译器知道对象的生命何时结束。它超出了范围。它会自动调用析构函数。如果您使用new
,则需要在之后致电delete
。
所以答案是。不仅在应用程序关闭时,而且在对象死亡时,对象可以自我清理。如果你泄漏记忆,你仍然应该是安全的,然后过程结束。
答案 4 :(得分:0)
当您“关闭程序”时,操作系统负责释放程序正在使用的任何内存。无论你如何创建矢量,当你“关闭程序”时,所有内存都将被恢复。你不必担心任何事情。
但是,在大型程序中,您不应该依赖用户“关闭程序”来释放使用的内存。如果您使用关键字“new”,则您负责调用“删除”。如果你声明了一个没有“new”的向量,你就不必做任何事情,因为析构函数会自动为你处理内存释放。
答案 5 :(得分:0)
看到这样的事情更为常见:
std::vector<MyType*> container;
而不是像这样:
std::vector<MyType> *container = new std::vector<MyType>;
事实上,在我15年多的编程中,我从未见过后者。在我看来,后者会破坏STL容器的用途。我想有人可能仍在为Windows 95做一些编程,但这似乎不太可能。任何STL容器最常见的问题是当你有一个指针容器时。由于容器不能是异构的,因此查看或使用指向基类接口类的指针的容器是相当普遍的。在这种情况下,您必须在从向量中删除内容之前循环并删除每个对象。如果向量丢失范围,它将不知道如何删除指向的对象。它只会清理已添加的指针的内存。
如果您执行以下操作,在函数或类声明中,则您没有内存清理义务。 STL实现可以正常工作,也可以不工作。无论哪种方式,程序员除了定义你自己的自定义分配器之外别无他法:
std::vector<MyType> container; // then add some stuff to it
我不打算进入boost或C ++ 11,但是FYI在boost中有一些特殊的容器类型,旨在使指针容器的用户更容易。我不确定是否有任何新的C ++ 11功能提供该功能。就个人而言,我建议您不要担心当程序泄漏内存时操作系统是否会做正确的事情。不要泄漏记忆。如果您正在使用嵌入式操作系统,请阅读文档并确保了解其STL实现是否有任何限制。