C ++内存管理问题,std :: vector nevere释放内存超出范围

时间:2019-02-16 05:56:52

标签: c++ stdvector

我对这个简单的代码感到非常困惑。 为什么这段代码可以释放分配的内存。

double *a;
for(int i = 0 ; i < 1000000 ; i++)
{
    if(1){
        a = new double ;
    }
    if(1){
        delete a;
    }
}

但是此代码无法删除分配的所有内存。

std::vector<double *>rubberList ;
for(int i = 0 ; i < 1000000 ; i++)
{
    rubberList.push_back(new double);
    //delete rubberList[i];
}
for(unsigned long j = 0 ; j < 1000000 ; j++)
{
            delete rubberList.at(j);
}

,并且在分配器块中删除项目时,会正确删除内存。

for(int i = 0 ; i < 1000000 ; i++)
{
    rubberList.push_back(new double);
    delete rubberList[i];
}

tnx

1 个答案:

答案 0 :(得分:0)

您发布的中间示例确实释放了所有内存。为了获得更多证据,我编译了您的代码,并使用words = str(input("Enter a word")) #Coal for word in words: if word !=''.join(sorted(word)): print("Letters not in alphabetical order") else: print("Letters are in alphabetical order") 运行了该代码:

  

== 5829 == Memcheck,内存错误检测器

     

== 5829 ==版权所有(C)2002-2017,由Julian Seward等人使用GNU GPL。

     

== 5829 ==使用Valgrind-3.13.0和LibVEX;使用-h重新运行以获取版权信息

     

== 5829 ==命令:测试

     

== 5829 ==

     

== 5829 ==

     

== 5829 ==堆摘要:

     

== 5829 ==在出口处使用:0字节,0块中

     

== 5829 ==堆总使用量:30个分配,30个空闲,分配的4,065个字节

     

== 5829 ==

     

== 5829 == 所有堆块均已释放-不可能泄漏

     

== 5829 ==

     

== 5829 ==对于检测到和抑制的错误的计数,请重新运行:-v

     

== 5829 ==错误摘要:0个上下文中存在0个错误(禁止:0个上下文中有0个)

您发布的代码不会清除内存。唯一不同的是,可能会使用更多的内存,因为您在中间的一个双打中分配了一吨的双打,而在第一个中一次只分配了一个双打。

您在哪里证明它不会删除内存?还是您还有其他意思?