在C语言中,我们不可避免的经常使用malloc()申请动态内存和free()释放内存,但是使用不当很容易导致程序崩溃:
通常我们会犯的内存问题大概有以下几种:
1.内存重复释放,出现double free时,通常是由于这种情况所致。
2.内存泄露,分配的内存忘了释放。
3.内存越界使用,使用了不该使用的内存。内存越界使用,这样的错误引起的问题存在极大的不确定性,有时大,有时小,有时可能不会对程序的运行产生影响,正是这种不易重现的错误,才是最致命的,一旦出错破坏性极大。
4.使用了无效指针,已释放对象,却再次操作该指针所指对象,多线程中某一动态分配的对象同时被两个线程使用,一个线程释放了该对象,而另一线程继续对该对象进行操作。
5.空指针,对一个空指针进行操作。
常见的崩溃:
1.free(): invalid next size (fast): 0x00007f89d001a790 ***
在使用malloc申请后,使用free()释放内存导致程序崩溃,这个问题好办,一般是释放的内存位置不对导致,可以在程序中加上判断。
例如:
char *buf = (char *)malloc(32);
//申请一段内存空间,一定要判断是否申请成功,成功则使用memset()清除一下
if(buf == NULL){
printf("malloc err!");
return -1;
}else{
memset(buf, 0, 32);
}
//释放内存
//一定要判断内存是否存在
if(buf) free(buf);
2.malloc(): memory corruption: 0x00007f3494014240 ***,corrupted size vs. prev_size: 0x00007fe6a401a720 ***
strcat,vsprint,memcpy, memset, memmove这些函数在操作申请的内存空间时候容易产生越界导致程序崩溃。
value = (char *)sqlite3_column_blob(stmt , i);
tbInfo->table[row][i] = (char *)malloc(strlen(value)+1); //add+1 解决
sprintf(tbInfo->table[row][i], "%s", value);
下面这个代码是我自己在项目中遇到的,当我malloc(strlen(value)),程序运行起来总是报.malloc(): memory corruption: 0x00007f3494014240 ***或者corrupted size vs. prev_size: 0x00007fe6a401a720 ***错误,找了好几天,定位到大致位置,但是一直没有解决问题,在网上查了很久,发现这个链接解决了我的问题https://www.coder.work/article/2186544(非常感谢),我在malloc(strlen(value)+1),我在后面申请空间+1,就解决程序一直崩溃问题。
可能其他人遇到的问题和我不同,但是相同的是使用内存越界就会导致程序崩溃,所以遇到上述报错问题,请检查strcat,vsprint,memcpy, memset, memmove等这些函数,看看使用的内存地址是否越界。
小白记录,不足请多多指教。