2023-12-29 C++薄弱知识点整理(C++内存部分)(3)

发布时间:2023年12月31日

1.函数返回值使用指针(不会用)

? (1) 不要返回函数局部变量或临时变量的地址(该地址如果期间被其他变量征用,会导致结果出现各种不认识的值)

正确方法:?

例:

int * add(int x,int y){

? ? ? ? ? ? ?int *sum = NULL;

? ? ? ? ? ? ?sum = new int;

? ? ? ? ? ? ?*sum = x+y;

? ? ? ? ? ? ?return sum;

}

int main(){

????????int a = 3;

????????int b = 4;

????????int *sum = NULL;

????????sum = add(a,b);

????????cout<<"sum = "<<*sum<<endl;

? ? ? ? delete sum;? ? ? ? //动态内存分配记得归还

}

(2)!! 返回静态局部变量的地址? ? 没有? ? 问题

2.内存常见错误总结[很多bug都是由于代码量巨大,遗忘部分操作后造成的]

(1)申请的内存多次释放:只允许释放一次

(2)内存泄漏:申请的动态内存没释放

(3)释放的内存不是申请时的地址:在进行一系列的指针操作后,指针可能已经不是最初申请动态内存的首地址了

(4)释放空指针:以为在代码运行中指针被赋值了,但是如果程序赋值那步出现了判定错误,

没有执行该语句,在下面释放指针时,就会出现错误

(5)释放一个内存块,但是继续引用其中的内容

(6)越界访问:动态内存也相当于一个数组,可能在对指针多次操作的过程中造成了越界访问

注:动态数组初始化:memset(指针,0,元素数量*sizeof(元素类型));

3.内存泄漏检测

内存泄漏检测工具:VisualC++ debugger 和CRT库

第一步:包含头文件

#define_CRTDBG_MAP_ALLOC

#include<stdlib.h>

#include<crtdbg.h>

第二步:接管new操作符

#ifdef DEBUG

#ifndef DBG_NEW

#define DBG_NEW new(_NORMAL_BLOCK,_FILE_,_LINE_)

#define new DBG_NEW

#endif

#endif

第三步:在代码结束处输出内存泄露信息

_CrtDumpMemoryLeaks();

内存泄漏工具:

Windows:Purify,BoundsCheaker,Deleaker,VisualLeak Detector,

Linux: Valgrind,memcheck

注:用完记得把这些代码删掉

??

??

文章来源:https://blog.csdn.net/m0_65850255/article/details/135288818
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。