calloc和malloc/free以及new/delete相关知识

 calloc/free和malloc/free是c/c++语言中的标准库函数,new/delete是c++运算符,都可以用来申请动态内存和释放内存。

1. malloc/free

malloc 的函数原型为:void * malloc(int size);

说明:malloc向系统申请分配指定size个字节的空间,返回类型是void *类型,意思是指返回的是未确定类型的指针,c/c++规定void *类型可以强制转换成任意类型的指针。

从malloc的声明上看,和new有一个不同点:new申请的空间返回指定类型的指针,而malloc不指定返回类型的指针,需要强制类型转换。

int *p = new int;

int *p  = (int *)malloc(sizeof(int));        或者int *p = (int *)malloc(4);

如果是int *p = malloc(sizeof(int));会报错:“不能将void *类型赋值给int *类型变量”。

如果是int *p = (int *)malloc(1);可以运行成功,但是只分配1个字节的空间,当往这个空间存一个整数时,就会占用你邻居三个字节的空间,导致的结果是邻居的三个字节空间原有的值被覆盖了。

例如:

int *p = (int *)malloc(1);

*p = 123456;

cout<<*p<<endl;

结果仍是123456,表面是没错,但实际上你占用别人的地盘,有可能下次就出错。

malloc和free是配套使用的,

free的函数原型为: void free(void *FirstByte);

说明:是将前边用malloc申请的空间释放返还给程序或者操作系统。

使用malloc/free要注意的地方:

(1),申请内存必须检测是否申请成功

(2),当不需要这块内存时要记得释放,释放后应该将原本指向该内存的指针指向空,防止程序在后边不小心用到它。

(3),这两个函数要配套使用,光申请不释放会造成内存泄露,释放这能一次,如果释放两次以上可能会出错(释放空指针除外)。

个例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
          char *a=NULL;
          a=(char *)malloc(10);
          strcpy(a,"testtest");
          printf("%s\n",a);
          free(a);
          free(a);
          a=NULL;
          return 0;
}可能不会出错,但是不知道什么时候就会出错。网上给的一个说法是可以使用环境变量export MALLOC_CHECK = 2,可以检测。目前还不知道怎么用。

2.calloc/free

calloc的函数原型是:void *calloc(size_t n,size_t size);

说明:在内存的动态存储区申请n个长度为size的连续空间,函数返回一个分配起始地址的指针,若不成功返回NULL。

它与malloc的区别是:calloc将申请的空间中的每一位都初始化为0;而malloc初始化,里边是一些随机的垃圾数据。

3.new/delete

new/delete是c++中运算符,它是用来动态申请/释放内存空间的。

4.new/delete和malloc/free的区别?

(1),new返回的是一个指定类型的指针,并且可以自动计算所需大小,而malloc则需要我们计算,且返回的是不确定指针类型,需要强制转换我们需要的指针类型。

(2),new/delete是运算符,而malloc/free是c中标准库函数。

(3),new动态申请的空间是在free store区,而malloc动态申请的空间是在heap区。关于heap和free store的一个

解释:http://blog.csdn.net/stone_x_boy/article/details/2071957

(4),malloc只管内存的分配,并不对所得的内存初始化,而new可以通过动用构造函数初始化。

(5),free释放的是指针指向的内存空间,里面应该是空的,而delete掉的内存空间中实际是还有数据的。

5.有了malloc/free为什么还要有new/delete?

对于非内部数据类型的对象而言,若要对象在创建的同时自动执行构造函数,对象在消亡之前自动执行析构函数。由于malloc/free是库函数不是运算符,不在编译器控制权限内,不能把指向构造函数和析构函数的任务强加给malloc/free。

所以c++需要一个能动态申请空间分配和初始化的运算符new,以及一个能完成清理和释放内存工作的运算符delete。

6.有了new/delete为什么还要有malloc/free?

这是因为c++经常要调用c函数,而c程序只能用malloc/free来管理动态内存。

7.new/delete和malloc/free最好是不要混用,可能会出错。

8.前面说过free后要把该指针指向NULL,那么delete后指针重置成什么?

delete p; //执行完该语句后,p变成了不确定的指针,在很多机器上,尽管p值没有明确定义,但仍然存放了它之前所指对象的地址,然后p所指向的内存已经被释放了,所以p不再有效。此时,该指针变成了悬垂指针(悬垂指针指向曾经存放对象的内存,但该对象已经不存在了)。悬垂指针往往导致程序错误,而且很难检测出来。
一旦删除了指针所指的对象,立即将指针置为0,这样就非常清楚的指明指针不再指向任何对象。(零值指针:int *ip=0;)

9.零指针和空指针的区别?

一个链接具体说明:http://www.cnblogs.com/fly1988happy/archive/2012/04/16/2452021.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值