C++ 释放指针向量,但内存仍在使用中

C++ 释放指针向量,但内存仍在使用中,c++,pointers,memory-management,vector,C++,Pointers,Memory Management,Vector,我不知道下面的代码有什么问题!我正在删除所有指针,但当我使用top命令查看内存时,我可以看到仍有大量内存分配给程序。我是不是错过了一些可以释放记忆的东西 #include <iostream> #include <vector> using namespace std; int main() { vector<int*> container; vector<int*>::iterator itr; unsigned lo

我不知道下面的代码有什么问题!我正在删除所有指针,但当我使用top命令查看内存时,我可以看到仍有大量内存分配给程序。我是不是错过了一些可以释放记忆的东西

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int*> container;
    vector<int*>::iterator itr;
    unsigned long long i;

    for(i = 0; i < 10000000; i++)
    {
        int* temp = new int();
        *temp = 1;
        container.push_back(temp);
    }

    for(itr = container.begin(); itr != container.end(); itr++)
    {
        delete *itr;
        *itr = NULL;
    }

    container.clear();
    cout<<"\nafter clear\n";

    while(1)
    {
        sleep(1000000);
    }

    return 0;
}

假设AllCoAction之后和解除分配之前没有抛出异常,则此代码中没有泄漏。您没有看到内存下降的原因是CRT可能不会立即将您删除的内存释放回进程。它可能会保留它以备将来使用。但是,可以保证,一旦进程终止,内存将被释放。

正如Naveen所说,代码中没有泄漏。但是,不推荐您编写循环的方式。您可以很容易地使用每个_来删除内存

纳文,我们有没有办法强迫CRT立即释放内存?在实际应用程序中,我们处理的是相同的问题。应用程序在一段时间后内存不足,这使得它陷入困境,因为服务器上缺少足够的可用内存!我们还使用Valgrind分析了应用程序,没有发现内存泄漏。这是操作系统的问题。当操作系统在其他地方需要内存时,它应该回收内存。Linux版本2.6.18-5-686 Debian 2.6.18.dfsg.1-13 gcc版本4.1.2 20061115预发布Debian 4.1.1-21从您描述的症状来看,您的内存似乎用完了,但是我不知道如何解决它。@Maysam:可能有一些内存泄漏不是那么容易跟踪的:典型的内存泄漏是指分配的内存永远不会被释放。对这些内存泄漏的搜索只会查找程序正常终止后未释放的内存。但在终止时会清理泄漏,但不会在两者之间!i、 e:指针被添加到列表中。该列表在终止时被清理并释放内存,但当程序运行时,它只分配和添加内存。因此,正常的泄漏搜索只会在程序运行时耗尽所有内存!Top不是用于确定内存是否泄漏的程序内存已释放。但在进程终止之前,内存永远不会返回操作系统。所以top永远不会看到内存下降。如果你有一个真正的程序,你怀疑它泄漏的不是这个玩具。然后,您应该运行valgrind来与它对抗,这将发现您的大部分问题。或者,你应该写C++而不是C代码,并使用RAII@Martin:如果我在for循环中为指针分配内存后立即删除指针,我怎么看不出内存上移p不是为您试图使用它而设计的。Top将为您提供操作系统分配给进程的内存估计。它不会指示当前使用了多少内存。进程内部将管理所有新的/删除调用,并跟踪分配给它的内存的使用情况。每当它需要更多内存时,它将要求更多内存,但很少将其返回操作系统。所以new可能会导致内存使用量增加,但delete可能不会降低内存使用量。使用适合作业的工具。为什么不建议使用这些循环?仅仅因为编译器可以做更多的优化,它们可能会稍微快一点?但是它们比需要声明一个函子类的for_更容易编码和阅读…看看循环中迭代器的后增量。我指的是那个。不过我可以说得更具体些。不管怎么说,如果他每个人都使用,他本可以避免这个问题。