Pointers and Memory
Stanford CS Education Library #102
一、Basic Pointers
指针主要有两个用途:使不同的代码段共享信息、方便链表(树)的处理。
指针示意图:

dereference操作会根据指针的值去找到它的pointee。
NULL是一个特殊的指针值(一般是地址0),表示这个指针不指向任何pointee。

指针的赋值会使得两个指针指向相同的pointee,但pointee本身不会改变:

传指针vs传值:

定义一个指针后,这个指针是没有被初始化的:

这时候如果进行dereference操作会发生Runtime Error.
对于Java、LISP等语言,当定义一个指针时,系统会将其设置为NULL,并且会在dereference操作时检查其值,这也是Java比较慢的原因之一。

一个比较典型的指针错误:
void BadPointer()
{
int* p; //allocate the pointer, but not the pointee
*p = 42; //serious RE
}
当执行*p时:

二、Local Memory
函数开始运行时,会为局部变量分配内存,结束运行会回收内存。
看一个错误的例子:
//TAB -- The Ampersand Bug function
int* TAB()
{
int temp;
return (&temp);
}
void Victim()
{
int* ptr;
ptr = TAB();
*ptr = 42; //The pointee was local to TAB
}
问题在于TAB()返回了一个局部变量的地址,但这个局部变量的空间已经被回收,ptr指针没有pointee。
三、Reference Parameters
传值:
void B(int worth)
{
worth++;
// T2
}
void A()
{
int netWorth = 55; //T1
B(netWorth);
// T3 -- B() did not change netWorth
}

传指针:
void B(int* worthRef)
{
(*worthRef)++;
// T2
}
void A()
{
int netWorth = 55; //T1
B(&netWorth);
// T3

传指针在c++中可以通过传引用的方式实现:

四、Heap Memory
分配示意图:

释放示意图:

释放后,指针虽然还在,但却不可以在使用。
//size以字节为单位,分配成功返回指针,失败返回NULL
void* malloc(unsigned long size);
//不需要size,因为heap manager之前已经记录过
void free(void* heapBlockPointer);


一个StringCopy()的例子:

对于分配的堆内存,只有一个负责释放的,要么是caller,要么是callee:

Pointers and Memory的更多相关文章
- golang 中Pointers Vs References
原文: https://spf13.com/post/go-pointers-vs-references/ Pointers Vs References Some languages includin ...
- 内存地址 Memory Management
Memory Management https://docs.python.org/2/c-api/memory.html Memory management in Python involves a ...
- Questions that are independent of programming language. These questions are typically more abstract than other categories.
Questions that are independent of programming language. These questions are typically more abstract ...
- mfc extention dll 與 normal dll 的區別
extention dll 1.指從MFC中繼承過來的DLL,一般要求使用共享MFC DLL進行連接,也要求調用者也使用MFC且使用共享MFC,如此可保證DLL與調用者有相同的MFC庫. 2.在使用資 ...
- MemProof教程
简介 MemProof(内存清道夫)是AutomatedQA出品的一款非常不错的检测内存泄漏和资源泄漏的免费调试工具,适合于WIN32平台下使用DELPHI/C++ BUILDER开发的应用程序. 利 ...
- <转载>国外程序员推荐的免费编程书籍资源
一.George Stocker 提供了一大串,分类如下: How to Design Programs: An Introduction to Computing and Programming 2 ...
- table2excel使用
原table2excel代码 /* * 采用jquery模板插件——jQuery Boilerplate * * Made by QuJun * 2017/01/10 */ //table2excel ...
- The correct way to initialize a dynamic pointer to a multidimensional array
From:https://stackoverflow.com/questions/18273370/the-correct-way-to-initialize-a-dynamic-pointer-to ...
- lock free数据结构内存回收技术-hazard pointer
lock free数据结构一般来说拥有比基于lock实现的数据结构更高的性能,但是其实现比基于lock的实现更为复杂,需要处理的难题包括预防ABA问题,内存如何重用和回收等.通常,最简单最有效的处理A ...
随机推荐
- Taro Next H5 跨框架组件库实践
作者:凹凸曼 - JJ Taro 是一款多端开发框架.开发者只需编写一份代码,即可生成各小程序端.H5 以及 React Native 的应用. Taro Next 近期已发布 beta 版本,全面完 ...
- 关于Cookie的相关知识点以及使用方法
首先介绍cookie的一些方法 response.addCookie(Cookie cookie)是将一个cookie对象传入客户端. Cookie cookie=new Cookie(String ...
- hadoop(九)启动|关闭集群(完全分布式六)|11
前置章节:hadoop集群namenode启动ssh免密登录(hadoop完全分布式五)|11 集群启动 配置workers(3.x之前是slaves), 删除localhost,添加102/103/ ...
- 超过百万的StackOverflow Flutter 问题
老孟导读:今天分享StackOverflow上高访问量的20大问题,这些问题给我一种特别熟悉的感觉,我想你一定或多或少的遇到过,有的问题在stackoverflow上有几十万的阅读量,说明很多人都遇到 ...
- Dubbo学习系列之十八(Skywalking服务跟踪)
我们知道,微服务不是独立的存在,否则就不需要微服务这个架构了,那么当发起一次请求,如何知道这次请求的轨迹,或者说遇到响应缓慢. 请求出错的情况,我们该如何定位呢?这就涉及到APM(Applicatio ...
- mysql几个操作数据库命令符下的常用命令
1.导出整个数据库 mysqldump -u用户名 -p密码 数据库名 > 导出的文件名 C:\Users\jack> mysqldump -uroot -pmysql sva_rec & ...
- 自己模拟的ftl 用法:
基类 public class Ftl_object_data_model { //三种基本属性 private boolean canRead=true;//是否能读取 ;//长度 private ...
- Redis学习一:Redis两种持久化机制
申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 Redis是基于内存来实现的NO SQL数据库,但是我么你都 ...
- 记录:如何使用ASP.NET Core和EnityFramework Core实现服务和数据分离
前情提要: 现有一个网站框架,包括主体项目WebApp一个,包含 IIdentityUser 接口的基架项目 A.用于处理用户身份验证的服务 AuthenticationService 位于命名空间B ...
- sublime text3添加并修改编译系统
版权声明:本文为CSDN博主「肥宅_Sean」的原创文章,遵循 CC 4.0 BY-SA 版权协议,原文链接 方法工具 -> 编译系统 -> 新建编译系统 按ctrl+s保存.(注意,这里 ...