指针分配空间
C的指针如果想被分配内存,需要malloc函数,举例:
struct link* head=(struct link* )malloc (sizeof(struct link));
首先分配一个struct link空间的大小,然后强转成struct link的指针类型
这个就是链表的头节点创建。
在C++中这个库函数仍然成立,但是还有更好的方法,new运算符。
int *a=new int;这样就给a分配了一个int型大小的地址。
正常的变量分配的内存来自栈的内存区域内,而new运算符是从堆内存区域分配内存。
释放内存
malloc函数对应着free函数,那new运算符也对应着一种方式释放分配的空间,那就是delete运算符。
int *a=new int;
delete a;
这样就能将分配给a的空间放回。
声明
- delete运算符只是释放空间,而不是删除指针的定义,也就是说释放之后这个a指针仍然可以使用。
- 如果只使用new而没有对应的delete来释放空间,会造成内存泄漏,这些空间就不可用,会造成麻烦。
- 对一个已经释放内存的空间,如果再释放一次,结果会不确定。这样的操作也是不允许的
- 对于一个指向其他变量地址的指针,不能用delete函数,因为这个空间不是分配的。
- 对于一个指向NULL的指针使用delete函数是安全的。
动态分配数组
静态联编和动态联编
静态联编就是正常的数组声明,
而动态联编则是使用new运算符来创建一个长度更灵活的数组。格式:
int *a=new int [10];//此时的a指向第一个元素的坐标
那么此时的delete函数是另一种格式: delete [] a;
带括号的目的是提醒系统是要释放整个数组而不是只释放数组第一位的内容。