我已经看到很多代码在进行分配时检查NULL指针.这使代码变得冗长,如果没有一致地完成,只有当程序员感觉到它时,甚至不能确保程序在地址空间用完时不会崩溃.此外,如果程序无法进行更多分配,那么它无论如何都无法完成其功能,对吧?
所以我的问题是,对于大多数程序来说,根本不检查并且如果内存耗尽会让程序崩溃,这不是更好吗?至少代码更具可读性.
注意
我说的是在现代计算机上运行的桌面应用程序(至少2 GB的地址空间),而且绝对不会运行航天飞机,生命支持系统或BP的石油平台.最重要的是,我在谈论使用malloc但从未真正超过5 MB内存使用量的程序.
我正在为公司写一些指导方针,我需要回答一些棘手的问题.这个很难.
解决方案可以是:
根本不跟踪.确保使用new分配对象,这将在分配失败时引发异常.该应用程序将死亡,这不是什么大不了的事.PRO - 代码通常可以非常干净.
跟踪内存分配失败并相应地报告,就像任何错误(例如文件访问错误)一样.
老实说,如果我们使用选项2,我必须编写更多代码.例如,许多std :: tring操作涉及内存分配.如
std :: string str1,str2; str1 = str2; str + = str2;
我们的软件将始终运行主要平台,而不是嵌入式.不知怎的,我认为选项1是要走的路.你怎么看?
我有一个命令行C程序,我使用calloc()函数为一个结构分配一些内存,该结构也有一个结构,并分配了一些内存.
如果我使用free()函数从父结构释放内存,它还会从子结构中释放内存吗?
或者我应该首先从子结构中释放内存?
试着理解我的问题的答案
当试图释放由堆管理器分配的内存时会发生什么,它分配的内容超过了要求?
我写了这个函数,并对其输出感到困惑
int main(int argc,char **argv){
char *p,*q;
p=malloc(1);
strcpy(p,"01234556789abcdefghijklmnopqrstuvwxyz"); //since malloc allocates atleast 1 byte
q=malloc(2);
// free(q);
printf("q=%s\n",q);
printf("p=%s\n",p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
q=vwxyz
p=01234556789abcdefghijklm!
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这种行为吗?或者这个实现是否具体?
如果free(q)被取消注释,我也会收到SIGABRT.