《从缺陷中学习C/C++》——6.10 delete与delete[]的区别

6.10 delete与delete[]的区别

从缺陷中学习C/C++
代码示例

char *buff = new char[reslen];
delete buff;

现象&结果
申请的数组空间没有全部释放,造成内存泄露。用cppcheck工具执行静态代码扫描可以看到如下信息:(error) Mismatching allocation and deallocation: buf。

Bug分析
对于数组类型,如 string str = new string[10],用delete str和delete [] str的区别是,delete str只对str[0]调用了析构函数,而delete []str则对str数组里的每个元素都调用了析构函数。对于单个元素,如 int p =new int (10),delete和delete []都可以释放内存。

正确代码

char *buff = new char[reslen];
delete [] buff;

编程建议
操作内存的时候,new[]一定要和delete[]对应。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-12-04 06:12:26

《从缺陷中学习C/C++》——6.10 delete与delete[]的区别的相关文章

《从缺陷中学习C/C++》导读

前言 从缺陷中学习C/C++ 这是一本在研究大量C/C++程序Bug基础上集结而成的书! 这是一本汇集众多一线C/C++编程人员智慧的书! 这是一本让您学好C/C++,绕过编程陷阱和障碍的必备案头书! 为什么写这样一本书 在不同的项目或产品中,不同的开发人员重复着同样的Bug,甚至同一个人重复相同的Bug.如果将时间周期拉得更长一些看:一个程序员,从刚毕业参加工作到具备丰富编程经验,从一个新手到成为专家,在这个过程中,每个人都在重复着前人走过的弯路,重复着同样的编程错误.测试人员在日常工作中积累

《从缺陷中学习C/C++》——6.14 正确使用引用参数和引用返回值

6.14 正确使用引用参数和引用返回值 从缺陷中学习C/C++代码示例 int &add(int n, int m) { n = n + m; return n; } int main() { int i = 10; int b = add(i, 1); cout << b << endl; return 0; } 现象&后果预期的输出结果是11,但实际输出的结果不确定. Bug分析add函数是一个函数引用,而add函数的返回值是形参n,形参是函数内的局部变量,函数

《从缺陷中学习C/C++》——第6章 内存使用

第6章 内存使用 从缺陷中学习C/C++在写C/C++程序时,一提到内存,大多数人会想到内存泄露.内存泄露是一个令人头疼的问题,尤其在开发大的软件系统时.一个经典的现象是,系统运行了10天.1个月都好好的,忽然有一天宕机了:OOM(Out Of Memory,内存用光)!于是,痛苦地查找内存泄露根源的过程开始了--本章主要讨论内存使用问题,包括内存泄露.悬挂指针.内存重复申请.变量的作用范围等,涉及指针.数组.引用等的使用. 本文仅用于学习和交流目的,不代表异步社区观点.非商业转载请注明作译者.

《从缺陷中学习C/C++》——6.7 指针赋值和指针赋址的混淆

6.7 指针赋值和指针赋址的混淆 从缺陷中学习C/C++代码示例 int main() { int a = 10; int* num = &a; function_b(num); printf("%d", *num); return 0; } void function_b(int* num) { int b = 20; int* buf =&b; if(*num < 0) num = num; else num = buf; } 现象&结果num指针指向

《从缺陷中学习C/C++》——6.9 重复申请内存未释放

6.9 重复申请内存未释放 从缺陷中学习C/C++代码示例 unsigned char* Func(void) { unsigned char *stra; stra = (unsigned char *)malloc(10); return stra; } int main() { unsigned char *strb; strb = Func(); strb = (unsigned char *)malloc(10); free(strb); return 0; } 现象&后果用一个指针指

《从缺陷中学习C/C++》——6.13 临时变量内存不能返回

6.13 临时变量内存不能返回 从缺陷中学习C/C++ 代码示例 char *initialize() { char str[300]; char* ptr = str; return ptr; } void useMyStr(char * str){ char tmp[300] = "123"; printf("%s\n", tmp); printf("%s\n", str); } int main() { char *myStr = init

《从缺陷中学习C/C++》——6.17 String对象何时需delete

6.17 String对象何时需delete 从缺陷中学习C/C++ 代码示例 int main() { string str1("stack-allocated str1"); string str2 = "stack-allocated str2"; string* str3 = new string("heap-allocated str3"); return 0; } 现象&后果 程序在运行时发生内存泄露. Bug分析 程序中使用

《从缺陷中学习C/C++》——6.16 结构体成员内存对齐问题

6.16 结构体成员内存对齐问题 从缺陷中学习C/C++ 代码示例 struct{ char flag; int i; } foo; int main() { foo.flag = 'T'; int pi = (int )(&foo.flag + 1); *pi = 0x01020304; printf("flag=%c, i=%x\n", foo.flag, foo.i); return 0; } 现象&后果 代码中定义了一个结构体,包括一个字符成员flag和整型成员

《从缺陷中学习C/C++》——6.18 小结

6.18 小结 从缺陷中学习C/C++ C/C++内存使用是一个深入的话题.内存使用是对内存申请.读写.释放过程的安排与统筹,从而实现内存的正确.高效使用.本章主要从正确性上讲解了内存使用的全过程,包含了常见的错误案例.希望通过本章节的内容,使读者对C/C++内存使用有正确的了解和认识. 本文仅用于学习和交流目的,不代表异步社区观点.非商业转载请注明作译者.出处,并保留本文的原始链接.