一个指针释放后不置空的后果: free(p)之后原本那块内存的数据已经被释放了,内存重新收回.但此时的指针变量依然指向那块内存,在以后的代码中若不小心继续调用指针变量,会出现不可预料的错误. 不置空的话,在后面由于无法检测指针的合法性,很可能误以为p合法,直接访问有可能会造成程序崩溃. 我们在平时编程时,对空指针很容易检测(if(NULL==p)),但是对于非法指针p不为空,我们是无法检测到的(即野指针). 防止对一个已经释放的指针多次释放造成程序崩溃,但是对一个null指针多次释放是合法的.…
在通过free()函数释放指针内存之后讲其指针置空,这样可以避免后面的程序对与该指针非法性的判断所造成的程序崩溃问题.释放空间,指针的值并没有改变,无法直接通过指针自身来进行判断空间是否已经被释放,将指针置空有助于判断一个指针所指向的空间已经被释放. 内存泄露: 例如:int *p = (int *)malloc(sizeof(int)),如果在用p只想其他地址,则原本malloc()分配的地址便找不到了,造成内存泄露的后果. free(p)后,p是一个非法指针,不可以对他进行访问.为了防止忘记…
1.fgets()函数 该函数是一个文件操作相关的函数 暂时使用这个函数可以从键盘上接收一个字符串,保存到数组中 char str[50]; 1)scanf("%s",str);//缺点:不能接收空格,也是不安全的 2)gets(str);//优点:可以接收空格 //缺点:会有一个警告,不安全的,比如数组的长度是50,我们输入的字符大于等于50的时候,会把50个字符全部放到数组中 //没有空间存放字符串结束符 3)fgets是一个安全的字符串接收函数,比如数组的长度是50,我们输入的字…
相信大家看到swap这个词都一定不会感到陌生,就是简单的元素交换.但swap在C++ STL中散发着无穷的魅力.下面将详细的说明泛型算法swap和容器中的swap成员函数的使用! 1. 泛型算法swap swap的函数原型: template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } vect中swap成员函数实现源码: void swap(vector<_Tp, _Alloc>& __…
DLL函数中内存分配及释放的问题 最近一直在写DLL,遇到了一些比较难缠的问题,不过目前基本都解决了.主要是一些内存分配引起问题,既有大家经常遇到的现象也有特殊的 情况,这里总结一下,做为资料. 错误现象是“其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug” 我的现象还有一个,就是直接运行EXE不在程序里调试,不会报这个错误. 从网上找到的资料是: 一个模块一个堆,一个线程一个栈. dll里malloc的内存,在exe里free会出错. CRT(C运行时期库…
C++中指针在new和delete操作的时候对内存堆都做了些什么呢.下面解: 1.指针的new操作: 指针在new之后,会在内存堆中分配一个空间.而指针中存放的是这个空间的地址.如: void main(){  int *p = new int(4);  cout << p << endl;  cout << *p << endl; } 输出为: 0x00431BF0 4 分别为分配的空间地址和地址内存放的值. 假设写为: void main(){  int…
第一部分:引用VS指针 引用的含义:变量的别名 注意:变量不能只有别名,必须有一个真实的变量与之相对应 基本数据类型的引用 对别名本身的操作和它的实体的操作是一样的 1.基本数据类型的引用 类型 &变量引用名=变量名 上述程序输出结果为:10 2.结构体数据类型的引用 类型 &结构体引用名=结构体名 上述程序输出结果为:10 20 3.指针类型的引用 类型 *&指针引用名=指针 上述程序输出结果为:20 4.引用作为函数参数 上述程序输出结果为:x=20,y=10 注意:推荐使用右…
朋友们对malloc函数应该是比较熟悉了,此函数功能是分配一段内存地址,并且将内存地址给一个指针变量,最后记得再调用free函数释放这段内存地址就可以了,标准的流程对吧,好像没什么问题.但是按照此标准流程,下面的程序却有个奇怪的现象: #include <stdio.h> #include <string.h> #include <malloc.h> int main() { char *p = (char *)malloc(6); if(NULL == p) { pr…
Visual Studio调试时,出现“触发一个断点”内存释放出现异常 数组和对应指针的NULL初始化 数组使用之前要先对其初始化 char Outi[4] = { NULL }; char Outj[4] = { NULL }; 对应指针进行动态初始化 #define SIZE 4 char *Outi = (char *)malloc(SIZE * sizeof(char)); memset(Outi, , SIZE * sizeof(char)); ; i <; i++) strcat(O…
13.9 Write an aligned malloc and free function that supports allocating memory such that the memory address returned is divisible by a specific power of two. EXAMPLE align_malloc (1000,128) will return a memory address that is a multiple of 128 and t…