当前位置: 首页 > 知识库问答 >
问题:

delete[]在C中真的有效吗?

段超
2023-03-14

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

int **banned;
banned=new int*[vertices];
for(i=0;i<vertices;i++)
    banned[i]=new int[k_colors];

它使用0.5 MB内存。然后我决定在返回行之前删除它:

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

使用函数开头的内存为8.5 MB。分配之后,它变成了9 MB,但删除部分之后,它仍然是9 MB。我在整个程序中执行这个函数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;
}

上面,在elitics()函数的第一行是分配部分,最后一行是删除部分。

共有2个答案

水睿
2023-03-14

当您在应用程序中分配内存时,C运行时将要求操作系统提供“更多内存”。在假设您将再次分配更多内存的情况下,“如果没有大量的内存被释放,请保持它”。换句话说,“任务管理器”和其他此类工具对于准确了解应用程序中实际分配了多少内存并不理想。

但是,删除[]确实适用于所有商业级发布的编译器环境。

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

对每个顶点调用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);

现在使用的内存会自动清理。

贺乐意
2023-03-14

要正确使用删除[],您应该删除与新建内容相同的内容:

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

delete[] banned;

您的“进程被杀死”可能是因为您的原始代码导致大量未定义的行为,多次删除同一指针等等。

此版本可能会也可能不会向操作系统释放内存;这是由编译器/库和操作系统做出的决定。在某些系统上,内存似乎仍然分配给您的进程,但如果另一个进程需要内存,操作系统将能够声明它。

如果你反复调用同一个函数,它不应该积累内存;以前的删除块可以应答新的呼叫。

 类似资料:
  • 每当有人在这里询问关于的问题时,总会有一个相当笼统的回答:“C++就是这么做的,使用delete[]”。作为一个普通的C背景,我不明白为什么需要一个不同的调用。 使用/,您的选项是获取一个指向连续内存块的指针,并释放一个连续内存块。在实现land中会出现一些东西,并知道您根据基址分配的块的大小,以便在您必须释放它时使用。 没有函数。我看到过一些与此切线相关的其他问题的疯狂理论,比如调用只会释放数组

  • 问题内容: 我想制作一个用C ++编写的服务器来支持我的游戏。我学习了套接字的基础知识,并编写了一个运行良好的基本聊天程序。现在,我想创建一个像Apache这样的HTTP服务器,但是仅用于AJAX请求- 响应部分。 我认为刚开始时,我复制了一个Apache响应文本,并使用C ++服务器程序发送了准确的响应。 问题是浏览器(Firefox)连接到apache,并且一切正常,除了所有请求均得到正确的响

  • 本文向大家介绍C ++中的有效三角数,包括了C ++中的有效三角数的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个由非负整数组成的数组,我们的任务是计算从数组中选择的三边形的数目,如果将其作为三角形的边长,则可以构成三角形。因此,如果输入类似于[2,2,3,4],则结果将是3,其中前2个为[2,3,4],[2,3,4]使用第二个2,而[2,2 ,3]。 为了解决这个问题,我们将遵循以下步骤

  • 我想用C#做一个简单的HTTP请求,但是有些东西不工作,我得到的是< code>403 Forbidden状态代码。 当我尝试在邮递员中执行相同的请求时,一切正常。我尝试运行 Fiddler 并查看邮递员发送的所有标头。我复制粘贴了所有这些,但我仍然在 C# 代码发送的请求中得到了 。 有人能解释一下为什么这不起作用吗?同样的标题,同样的一切。 我用“example.com”替换了 url,因为我

  • 在C语言中,我有一个任务,我必须做乘法、求逆、移位、加法等,用巨大的矩阵分配为二维数组(数组的数组)。 我找到了gcc标志。如果我理解正确,这将自动展开所有循环,而无需程序员进行任何努力。 我的问题是: a) gcc是否包括这种带有各种优化标志的优化,如,等。? b)我必须在我的代码中使用任何s来利用循环展开,还是自动识别循环? c)如果展开提高了性能,为什么默认情况下不启用此选项? d) 为了以