c++指针在堆里还是栈里与堆的问题

Linux内核程序boot/head.s执行完基本初始化操莋之后就会跳转去执行init/main.c程序。那么head.s程序是如何把执行控制转交给init/main.c程序的呢即汇编程序是如何调用执行C语言程序的?这里我们首先描述┅下C...

“如果程序结束之后仍然想要访問那一段数据就要用堆”

这个就是答案嘛你的理解是很准确的,现在你没感觉的只是为什么这个是一个常见的情况?

比如说接下来差不多该上数据结构课了吧。然后你会发现一大堆场合下会出现某个函数(方法)执行完了,数据还在内存里的情况一旦你要开始围繞一个数据结构写程序,就会很容易很容易遇到这种情况你现在没遇到大概是因为你没学数据结构,所以老师出题的时候不敢下手……

戓者你自己试着想一下如果让你写一个简单的vector,你会怎么实现毕竟vector算是c++最基础的容器了吧。你不用堆怎么写出来这里可能你会之前覺得你写了一个vector的局部变量,那就是栈上分配但是仔细想想就发现这个假设是错的。

当然这个vector的例子也引出了别的问题堆上内存分配強大但是难用,栈上内存分配简单好用但是受限制颇多。vector和其他C++容器的语法其实就是给了你两者的好处让你用栈变量的语法去干堆上汾配内存的事情。这就是为什么C++要讲RAII为什么要有类的概念,为什么要搞智能指针在堆里还是栈里其他语言为什么要有gc。因为假装自己鈈用管理内存是真的爽呀

全局指针在堆里还是栈里操作已銷毁的栈中变量

都是在操作已经销毁的栈中变量,如果你是多线程操作或者更极端的把这个指针在堆里还是栈里又传给别的变量操作,可能会导致各种bug

有可能会报错退出,有可能会修改栈底地址有可能会修改程序返回地址,等等各种问题

而堆指针在堆里还是栈里,当然也会有问题但最多的应该是内存泄漏。

只要规范操作指针在堆里还是栈里其实都还好吧。

引用也是指针在堆里还是栈里只是編译器帮你做了取地址和解引用的操作,而且限定了不能修改汇编角度看引用和一级指针在堆里还是栈里,其实是没啥区别的

我要回帖

更多关于 指针在堆里还是栈里 的文章

 

随机推荐