重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
标准库返回指针, 一般有三种情况
创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为南岳企业提供专业的做网站、成都网站建设,南岳网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
一种是 返回的指针,就是你传入参数或者其中的一部分。
典型的是字符串操作函数,比如 strcmp, strcpy, strstr等等。
第二种,是返回的指针,需要调用特定的函数去释放。 比如fopen函数返回的FILE*,需要调用fclose去释放。
第三种, 返回的指针,需要自行调用free去释放。
比如 malloc realloc 类的申请内存函数
以及strdup一类的复制函数。
每个标准库函数,都有自己的规范。 按照要求操作就不会内存泄露。否则就会产生。
必须出栈!
aa 和 bb 和c 都是函数内部的局部变量,函数返回后就被释放,也就是在栈中没有了,返回后就剩下图中main()函数所对应的栈结构.
栈只能够通过出栈来减少栈中数据的个数,从反面来讲,如果不出栈,funcA()函数返回后,栈指针还是指向c那,这肯定是不对的,因为函数返回后栈指针就得指向man()的栈结构了。
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆内存发生泄漏的情形:
void MyFunction(int nSize)
{
char* p= new char[nSize];
if( !GetStringFrom( p, nSize ) ){
MessageBox(“Error”);
return;
}
…//using the string pointed by p;
delete[] p;
}
当函数GetStringFrom()返回零的时候,指针p指向的内存就不会被释放。这是一种常见的发生内存泄漏的情形。程序在入口处分配内存,在出口处释放内存,但是c函数可以在任何地方退出,所以一旦有某个出口处没有释放应该释放的内存,就会发生内存泄漏。