是的你可以信任载体自行清理。
然而你不能相信东西矢量持有自己清理之后。需要清理的内容可能会在应用程序之外持续存在。如果它的记忆,这不是一个担心。如果确保XML标签全部关闭,那么操作系统将无法为您提供帮助。
例如,如果你有这样的一些靠不住的锁定对象的向量:
class CLock
{
public:
CLock() {}
~CLock() {}
void Lock(...) {...}
void Unlock(...) {...}
};
std::vector<CLock> myLockVec;
如何将其完成时,你的时钟的专有的矢量解开一切吗? Vector的构建不了解锁。
这本质上是相同的情况下具有指针的向量:
std::vector<int*> myIntVec;
如何矢量知道哪些指针这里已被删除,NULL'd,以及哪些是真的吗?也许有些已被删除并设置为您的特殊值0xdeadbeef,意思是删除。
的点是向量没有手段知道这个或知道其元素是指针或锁或任何。他们只需要具有默认构造函数并且是可复制的,并且满足向量对其元素的其他这样的需求。
解决方案是可以肯定的,无论矢量HOLDS需要负责其清理。这叫做RAII - 资源分配是初始化,在这里更重要的是资源销毁是取消分配。通过上面的CLock示例,答案很明显,一定要在完成时解锁!
class CLock
{
...
~Clock()
{
if (locked)
{
Unlock();
}
}
}
但是指针其实并不那么明显。解决方案是将指针包装在smart_ptr类中。其中最多产的是boost family of smart poniters。
class CSmartPointer<T>
{
CSmartPointer(T* rawPtr)
{
m_ptr = rawPtr;
}
~CSmartPointer()
{
delete m_ptr;
}
}
附加功能得到了充分的指针如引用计数,但上面的例子应该给你的问题的性质的要点以及如何它的典型解决。
通过“每次我跑我的程序的时候我失去RAM”你的意思或“我的可用RAM获取即使我退出程序小“直到我退出程序我的可用内存变小”了,它变得更小了下一次我跑,直到有一天,我将完全没有内存剩下“? – 2009-06-08 19:31:45
我借调Max的问题。 Windows我相信实际上并没有卸载已终止的程序,除非需要。这样他们在第一次之后就开始更快。 – 2009-06-08 19:48:18
“我想第三个问题刚刚想到,如果矢量是自动创建在堆上,为什么你会使用新的关键字?” 如果您需要将矢量传递到当前范围之外的某个点,则只需执行此操作。这在实践中比较少见。 – rlbond 2009-06-09 04:09:28