关于变量的生命周期和new delete的问题

时间:2022-08-01 14:42:49
根据书上说,在函数中定义的变量,生命会在这个函数结束后自动结束,也就是释放掉了

那么在main函数中定义的变量,某种情况下不就是全局变量吗?

另外,如果new一个空间出来,而我没有delete它,是不是它就不会释放?哪怕main结束

如果我说的是对的,那我直接都用指针不就好了?不然定义变量还要考虑作用域的问题,明显多此一举啊……

再次另外,有时候又觉得指针很多余,比如我int *a;  明显没有int a; 好,因为前者开辟了两个空间,一个存放整数,一个存放地址;而对于后者只开辟了一个空间存放整数。【额……作用域嘛……暂时不考虑】

问题是不是很痴线啊……但是真的搞不懂语言开发者们是怎么个想法 关于变量的生命周期和new delete的问题

12 个解决方案

#1


追问一个

int *a;



new int

有什么区别吗……都是开辟一个空间存放整数……

#2


自动释放是为了 方便你写代码 
如果你不懂这第一 说明你 代码写太少了

#3


那换一种方法讲就是

指针是高手用的 释放要手动

直接定义变量是新手用的 方便学习

是这个意思?

#4


引用 3 楼 f27ny105t5123 的回复:
那换一种方法讲就是

指针是高手用的 释放要手动

直接定义变量是新手用的 方便学习

是这个意思?

不是吧,主要是看你能不能用好指针

#5


要么你看的书不合格,要么你误解作者了。
1.栈的空间有限, 不能所有的对象都放在栈。所有需要堆和全局空间。 
2.为啥有指针?间接性带来了灵活性和高性能。 
3.(虚拟)内存不是无限的, 为了访问更多数据,进程需要中途释放部分空间,从而载入更多输数据。 

#6


LS

间接性可以带来灵活性,怎么带来高性能?直接性可以带来高性能吧= =!无法理解。我是自学的,所谓栈我也不知道是什么东西,可能以后接触数据结构会有了解吧,还有,释放空间是系统自动释放吗?如果把我需要的数据释放了怎么办?也就看的谭浩强的书,可能的确理解方面有问题吧……

#7


顶上去,不要沉吗……              

#8


对于1L自己追问的问题搞清楚了,貌似是必须这么做,就是这么规定的是吧……额……

#9


引用 6 楼 f27ny105t5123 的回复:
LS

间接性可以带来灵活性,怎么带来高性能?直接性可以带来高性能吧= =!无法理解。我是自学的,所谓栈我也不知道是什么东西,可能以后接触数据结构会有了解吧,还有,释放空间是系统自动释放吗?如果把我需要的数据释放了怎么办?也就看的谭浩强的书,可能的确理解方面有问题吧……


谭浩强的书就不要看了,纯粹误人子弟,看C++ primer吧
关于堆和栈并不是说就是数据结构中的,这里涉及到C++的内存管理。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这部分内存就自动释放。栈的效率很高,但是容量很小。栈上的内存管理是编译器进行操作的。

堆,就是new分配的内存块,他们的释放编译器不会管,所以就是程序员做的事情。而你不释放的话,这部分在函数里面声明的指针以及申请的内存因为作用域的问题你也无法访问,就会造成内存泄漏。所以你说的什么申明一个指针就是全局变量这也不存在。

#10


引用 3 楼 f27ny105t5123 的回复:
那换一种方法讲就是

指针是高手用的 释放要手动

直接定义变量是新手用的 方便学习

是这个意思?

同意9楼观点(第一句话)
另外,
int *a;

new int
前者声明了一个指针(不知指哪里,没有分配空间),后者分配了一个int型空间,两者有关系吗?(我想到的唯一关系是 int *a = new int;)

int a = 1; //分配在栈上
int *b = new int; //分配在堆上

栈空间一般较小,默认 1MB 或 2MB,如果想分配 4MB 的内存,就得在堆上分配。

#11


lz 对于所提问题的理解和想法都是错的。。。
不过回想起来,我刚开始学的时候的理解也不怎么对(我接触的第一本“教程”也是谭绿皮)。
后来学了x86汇编后,才逐渐弄清楚“堆栈”是什么,还有 auto、static、register、extern 各自的作用,以及分配内存的类型和位置,全局、静态、*存储和堆内存。

lz 如果想深入理解的话,也学一下汇编吧

#12


我觉得9楼说的很好....谭浩强确实比我们牛..但他的书和国外的比确实差远了...

#1


追问一个

int *a;



new int

有什么区别吗……都是开辟一个空间存放整数……

#2


自动释放是为了 方便你写代码 
如果你不懂这第一 说明你 代码写太少了

#3


那换一种方法讲就是

指针是高手用的 释放要手动

直接定义变量是新手用的 方便学习

是这个意思?

#4


引用 3 楼 f27ny105t5123 的回复:
那换一种方法讲就是

指针是高手用的 释放要手动

直接定义变量是新手用的 方便学习

是这个意思?

不是吧,主要是看你能不能用好指针

#5


要么你看的书不合格,要么你误解作者了。
1.栈的空间有限, 不能所有的对象都放在栈。所有需要堆和全局空间。 
2.为啥有指针?间接性带来了灵活性和高性能。 
3.(虚拟)内存不是无限的, 为了访问更多数据,进程需要中途释放部分空间,从而载入更多输数据。 

#6


LS

间接性可以带来灵活性,怎么带来高性能?直接性可以带来高性能吧= =!无法理解。我是自学的,所谓栈我也不知道是什么东西,可能以后接触数据结构会有了解吧,还有,释放空间是系统自动释放吗?如果把我需要的数据释放了怎么办?也就看的谭浩强的书,可能的确理解方面有问题吧……

#7


顶上去,不要沉吗……              

#8


对于1L自己追问的问题搞清楚了,貌似是必须这么做,就是这么规定的是吧……额……

#9


引用 6 楼 f27ny105t5123 的回复:
LS

间接性可以带来灵活性,怎么带来高性能?直接性可以带来高性能吧= =!无法理解。我是自学的,所谓栈我也不知道是什么东西,可能以后接触数据结构会有了解吧,还有,释放空间是系统自动释放吗?如果把我需要的数据释放了怎么办?也就看的谭浩强的书,可能的确理解方面有问题吧……


谭浩强的书就不要看了,纯粹误人子弟,看C++ primer吧
关于堆和栈并不是说就是数据结构中的,这里涉及到C++的内存管理。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这部分内存就自动释放。栈的效率很高,但是容量很小。栈上的内存管理是编译器进行操作的。

堆,就是new分配的内存块,他们的释放编译器不会管,所以就是程序员做的事情。而你不释放的话,这部分在函数里面声明的指针以及申请的内存因为作用域的问题你也无法访问,就会造成内存泄漏。所以你说的什么申明一个指针就是全局变量这也不存在。

#10


引用 3 楼 f27ny105t5123 的回复:
那换一种方法讲就是

指针是高手用的 释放要手动

直接定义变量是新手用的 方便学习

是这个意思?

同意9楼观点(第一句话)
另外,
int *a;

new int
前者声明了一个指针(不知指哪里,没有分配空间),后者分配了一个int型空间,两者有关系吗?(我想到的唯一关系是 int *a = new int;)

int a = 1; //分配在栈上
int *b = new int; //分配在堆上

栈空间一般较小,默认 1MB 或 2MB,如果想分配 4MB 的内存,就得在堆上分配。

#11


lz 对于所提问题的理解和想法都是错的。。。
不过回想起来,我刚开始学的时候的理解也不怎么对(我接触的第一本“教程”也是谭绿皮)。
后来学了x86汇编后,才逐渐弄清楚“堆栈”是什么,还有 auto、static、register、extern 各自的作用,以及分配内存的类型和位置,全局、静态、*存储和堆内存。

lz 如果想深入理解的话,也学一下汇编吧

#12


我觉得9楼说的很好....谭浩强确实比我们牛..但他的书和国外的比确实差远了...