关于new一点不明白之处;
void fn()
{
Tdate * Ps;//(1)
Ps = new Tdate;//(2)分配堆空间并构造它;
//...
delete Ps;//(3)先析构,将空间返回给堆;
}
书上接着说:
如果是分配局部对象,则在该局部对象退出作用域时(要么程序遇到函数结束标记‘}’,要么是return语句)
但是堆对象的作用域是整个生命周期。堆对象析构是在delete语句上执行。
我的理解:(1)处是申明且定义了一个Tdate指针;
(2)处是将指针指向一个特定的堆中区域;
然后使用该区域;
如果此函数没有(3)
Ps 还是离开了该函数被释放掉。而开辟的堆空间将没有释放。是这样么??
[解决办法]
基本上是这样的。
[解决办法]
函数结束后,指针无效,但申请的空间还在,在整个程序结束后被释放。
[解决办法]
離開函數后,Tdate,這個變量的空間無效(被釋放), 但是它指向的空間是需要delete才能釋放的。
[解决办法]
Ps 还是离开了该函数被释放掉,但Ps所指的内存空间仍标志为不可被分配的,即你只要取得这段内存的首址,一样可以继续用,而不用担心被重新分配以至于影响你保存在这里的数据,其实C中的malloc就是返回了一个被分配的内存段的首地址,就是这么回事.