C++指针陷阱:高效背后的致命危险

1、指针的危险

在C++中,指针是提高效率的有效路径,通过指针,我们可以大大提高C++的运行效率,但是万事都会有缺点,指针也不例外。而指针的危险往往会发生在哪些不仔细的人身上,在C++中创建指针时,计算机将分配储存指针的内存,但是不会分配用来储存指针所指向的数据的内存,因此为数据提供空间是一个独立的步骤,如果忽略了这一步将导致麻烦产生,例如:

long* fellow;

*fellow=2333333;

在这里,我们虽然声明了一个指针,但是没有初始化指针就开始将数据赋给指针所指向的地址,简单来说,指针还没有找到一个地址能够储存数据,这将导致数据没有具体的内存安放所以才导致了错误,这里正确的做法是,在解除对指针的引用(前面一篇文章讲到过)之前,我们应该先给指针赋上相应的地址,然后再解除对指针的应用,例如这样:

long a;

long *fellow=&a;

*fellow=23333333;

这样问题就解决了。

ps:在没有给指针赋上相应的地址之前,千万不要解除引用。

2、使用new来分配动态内存

在C++中我们经常使用new运算符来分配动态内存,什么是分配动态内存呢,就是根据实际的需求来分配内存而不是事先将内存定好,例如:

int* pt=new int;

这里我们给new int 运算符告诉编译器需要找一个能够储存int的内存块,然后new运算符根据int类型找到合适的内存块,然后返回地址给pt,完成一个动态内存的分配。为什么要使用动态分配类型呢?是因为C++是效率至上,所以呢如果是一般的变量分配内存,将有时候导致分配的内存太少或者太多,都不适合程序的运行,而动态分配的内存将解决之一问题,它在实现中根据需要的内存来分配的,能够适应各种内存,下面我们将举一个例子让你更加直观的感受到:

int color[50]={2,6,8,4,5}

double fifiy[1110]={4.2,8.6,5.6,5.2,1.9,8.6,3.7}

int n;

int *pt=new int[n];

n可以根据具体的大小实现动态过程。

3、如何使用new以及如何释放内存

为一个数据对象分配内存时的通用格式是:

typename *pointer=new typename;

如果是一个数组,那就在后面加上[],中括号里面可以是常量 也可以是变量,例如:

typename* pointer =new typename[n];

typename* pointer =new typename[5];

这样都是正确的。讲了如何分配内存,现在将如何释放内存。

一般释放内存都在使用完变量之后,如果提前释放内存,将导致指针无法找到相应的地址,将会导致严重的后果,所以在没有使用完变量之前,不要先释放内存。

释放内存通过delete来释放,根据前面分配内存的时候,如果前面没有加[],那就这样释放:

delete pointer;

如果加了[],那就这样:

delete []pointer;

如果你觉得太麻烦了,那就无脑的使用第二种,第二种表示方法是万能的。

注意,一定要记得释放内存,否则分配的内存无法自己自动释放,将一直储存在电脑中导致电脑中的内存越来越少,使得系统瘫痪。

相关推荐
豐儀麟阁贵14 分钟前
5.6对象
java·开发语言
嵌入式小李.man34 分钟前
linux中多路复用IO:select、poll和epoll
linux·c++
郝学胜-神的一滴37 分钟前
QAxios研发笔记(二):在Qt环境下基于Promise风格简化Http的Post请求
开发语言·c++·笔记·qt·网络协议·程序人生·http
敲代码的嘎仔40 分钟前
数据结构算法学习day3——二分查找
java·开发语言·数据结构·学习·程序人生·算法·职场和发展
m5655bj1 小时前
如何使用 Python 转换 Excel 工作表到 PDF 文档
开发语言·c#·excel
晨非辰1 小时前
《数据结构风云》:二叉树遍历的底层思维>递归与迭代的双重视角
数据结构·c++·人工智能·算法·链表·面试
ᐇ9591 小时前
Java核心概念深度解析:从包装类到泛型的全面指南
java·开发语言
逻极1 小时前
Rust之旅的起点:为什么选择Rust?
开发语言·后端·rust
Tony Bai1 小时前
从 Python 到 Go:我们失去了什么,又得到了什么?
开发语言·后端·python·golang
华如锦2 小时前
使用SSE进行实时消息推送!替换WebSocket,轻量好用~
java·开发语言·网络·spring boot·后端·websocket·网络协议