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 ...
随机推荐
- python--Django(三)视图
Django的视图 不同于其他语言的MVC模式,Django采用的是MVT模式,即Model.View.Template,这里的View其实质就是其他语言中的Controller(emmm.....) ...
- 二维码,QR码,编码原理与实现
文章更新于:2020-02-18 注:开头是四篇文章的链接,下面是这四篇文章的截图 # 想了解二维码,读这几篇就够了 # 二维码的基础原理是什么 https://cli.im/news/help/10 ...
- go 错误处理与测试
Go 没有像 Java 和 .NET 那样的 try/catch 异常机制:不能执行抛异常操作.但是有一套 defer-panic-and-recover 机制(参见 13.2-13.3 节). Go ...
- Quil-delta-enhanced 简介
Quill 是一款时下非常热门的富文本编辑器,它拥有非常强大的扩展能力,可以让开发者根据自己的需要编写插件,使编辑器支持的内容类型更加丰富.它之所以能够拥有这么强大的扩展能力,一方面是因为它的架构和 ...
- Android Google Play app signing 最终完美解决方式
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/105561341 本文出自[赵彦军的博客] 在 GooglePlay 创建 App ...
- intellij idea 设置用真机测试android
android自带的模拟器是不容置疑的慢,genymontion虽然快,但是觉得有点怪的感觉,哈哈,其实这些都不是重点. 之前是用myeclipse开发android的,虽然一直很想用eclipse来 ...
- L24 word2vec
词嵌入基础 我们在"循环神经网络的从零开始实现"一节中使用 one-hot 向量表示单词,虽然它们构造起来很容易,但通常并不是一个好选择.一个主要的原因是,one-hot 词向量无 ...
- Python - 利用词云wordcloud,jieba和中国地图制作四大名著的热词图
热词图很酷炫,也非常适合热点事件,抓住重点,以图文结合的方式表现出来,很有冲击力.下面这段代码是制作热词图的,用到了以下技术: jieba,把文本分词 wordcloud,制作热图 chardet,辨 ...
- 处理数字的类 —— Math类 、 Random类 、 BigDecimal类 与 BigInteger类
在我们学习C语言时,我们处理数据时要调用很多函数,那么,Java也有很多的方法可以来处理数值的类. 那么,在本篇博文中,本人就来讲解三个用于处理数值的类 -- Math类 . Random类 与 Bi ...
- windows UAC 提权实验(CVE-2019-1388)
--------------------------------------------------------------------------------- 声明:本文仅做学习,实验主机为虚拟机 ...