C++ delete[]在C++;?

C++ delete[]在C++;?,c++,memory-management,delete-operator,C++,Memory Management,Delete Operator,我有一个函数,每次运行时都使用0.5 MB内存。因此,我决定通过同时观察Windows任务管理器来逐步研究它。我注意到在这些台词之后: int **banned; banned=new int*[vertices]; for(i=0;i<vertices;i++) banned[i]=new int[k_colors]; 它是8.5MB内存,使用函数的开头。分配之后,它变成了9MB,但删除部分之后,它仍然是9MB。我在整个程序中执行这个函数1000次。然后它就被操作系统杀死了。你

我有一个函数,每次运行时都使用0.5 MB内存。因此,我决定通过同时观察Windows任务管理器来逐步研究它。我注意到在这些台词之后:

int **banned;
banned=new int*[vertices];
for(i=0;i<vertices;i++)
    banned[i]=new int[k_colors];
它是8.5MB内存,使用函数的开头。分配之后,它变成了9MB,但删除部分之后,它仍然是9MB。我在整个程序中执行这个函数1000次。然后它就被操作系统杀死了。你知道为什么吗?我该怎么解决

编辑:这里是
main()
部分:

int main()
{
    srand(time(0));
    input();
    initialize();
    for(int i = 0; i < MAX_GENERATION; i++)
    {
        parents = selection(TS);
        population = cross_over(parents, PC);
        mutation(PM);
        elite=tabu_search(population);
        elitism(); //270 MB memory using each time.

    }
fclose(pFile);
return 0;
}
intmain()
{
srand(时间(0));
输入();
初始化();
对于(int i=0;i

在上面的
elitism()
函数中,第一行是分配部分,最后一行是
delete
部分。

要正确使用
delete[]
您应该删除新创建的内容:

for(i=0;i<vertices;i++)
    delete [] banned[i];

delete[] banned;

<代码> >(i=0;i)当您在应用程序中分配内存时,C++运行时将向OS请求“更多内存”。假设您将重新分配更多内存,“如果没有大量内存释放,请保持它”。换句话说,“任务管理器”。而其他此类工具对于准确了解应用程序中实际分配了多少内存并不理想

然而,
delete[]
确实适用于所有商业级发布的编译器环境

代码中的问题是您正在删除未分配的内容

您为每个
顶点调用
delete[]
,为整个数组调用一次,以匹配您的
new
调用。[每个有
new
的地方,都应该有完全相同的
delete
-相同的次数,相同的指针]

也有可能是你在“分割”记忆——比如像这样的东西

size_t s = 100;
for(;;)
{
    int *p = new int[s];

    ...
    delete [] p; 
    s += 10;
}
因此,释放的内存对于下一次分配来说“太小”

当然,通过使用

vector< vector <int> > banned(vertices);
for(i=0;i<vertices;i++)
   banned[i].resize(k_colors);
vector禁用(顶点);

对于(i=0;i
delete[]
不会将内存返回到操作系统。它是否将内存返回到操作系统并不重要。重要的是,返回内存的方式使将来的分配可以重新使用该内存。是将内存返回到操作系统,还是在内部将其标记为未使用,都无关紧要。无论哪种方式,重复都是正确的dly运行同一功能不应导致内存使用量重复增加,这似乎表明某个地方存在泄漏。您在这段代码中没有
delete
new
相同的内容,btw@WhoCares-那是因为你的代码是错误的。你循环一种分配方式,然后完全不同的东西被释放。换句话说,你迷失了方向,没有正确地倒转方向。@WhoCares-下面MattMcNabb给你的答案解决了这个问题。如果“工作”的意思是“不可能使用而不引入无数可怕的错误,并且在各个方面都比其他方法差”,那么是的。这是“工作”的一个相当奇怪的定义,不过。嗯,这是另一点。大多数容器类型的基本原理是
new
delete
[虽然通常包装在分配器类中,但这只是上面的sugar]再说一遍。这在windows中运行得很好,但在linux中它返回seg.fault。你知道为什么吗?你没有发布的代码中有一个bug。试着调试你的程序。在linux中使用gdb和valgrind。现在我用valgrind调试了它。我删除了你给我的代码。它在linux中运行得很好。用这个形状,我用valgrind运行了它,它给出了一个关于
fscanf()
的错误。但是,它们是程序中非常不同的部分。我的意思是
fscanf()
删除
部分。而且,如果我再次添加代码,valgrind没有告诉我你给我的代码的任何信息。它仍然说明了
fscanf()
。你认为它们之间有什么联系吗?顺便说一句,我把它与
valgrind--leak check=yes
行一起使用。开始一个新问题
fscanf
与这个问题无关。听起来你好像有堆损坏。请确保发布MCVE,否则人们只是猜测。
vector< vector <int> > banned(vertices);
for(i=0;i<vertices;i++)
   banned[i].resize(k_colors);