首先聲明這篇文章內(nèi)容并不新鮮,,也許很多人寫過類似的文章,,如果有雷同的地方請不要誤會,本文的確是本人原創(chuàng),。寫這篇文章的目的只是為了讓自己記得更清楚,,同時公布出來希望高人指點,我這樣的做法能否達(dá)到我想要說明的問題的,。 進(jìn)入正題: 我這篇文章是為了弄清楚在一個函數(shù)內(nèi)部定義一個對象,,當(dāng)這個函數(shù)退出時這個對象的生存期是否就結(jié)束,還是說結(jié)束了,,只是沒有釋放內(nèi)存空間,。 我的測試源碼如下: "Aclass.h" ******************************************************* #pragma once using namespace std;
public: **************************************************
#include "Aclass.h"
Aclass::Aclass(void) { m_Num = 0; name = ""; } Aclass::~Aclass(void) { } void Aclass::setName(string strname) { name = strname; } void Aclass::setNum(int num) { m_Num = num; } void Aclass::printInfor()
{ cout<<"this obj name is "<<name<<" "<<"num is "<<m_Num<<endl; } *******************************************************************
#include"Aclass.h"
unsigned long int * addr=NULL; //這個指針是用來保存對象的地址
void atest() { Aclass *a = new Aclass(); addr = (unsigned long int *)a; a->setNum(5); a->setName("is my?yes"); a->printInfor(); } int main() { atest(); Aclass *a = (Aclass *)addr; a->printInfor(); return 0; } //當(dāng)用new生成一個對象時得到結(jié)果:
證明在函數(shù)退出后 a 對象的空間依然存在,,里在面的值沒有改變,,這里有一個疑問:這個對象是否合法,也就是這個對象是否像局部變量一樣被銷毀了,,但系統(tǒng)沒有回收。(補(bǔ)充:我們分配了一塊堆內(nèi)存,,那么指針a呢,?他分配的是一塊棧內(nèi)存,所以這句話的意思就是:在棧內(nèi)存中存放了一個指向一塊堆內(nèi)存的指針a.在程序會先確定在堆中分配內(nèi)存的大小,,然后調(diào)用operator new分配內(nèi)存,,然后返回這塊內(nèi)存的首地址,放入棧中)
下面改成非new的形式:
unsigned long int * addr=NULL; //這個指針是用來保存對象的地址
void atest() { Aclass a; addr = (unsigned long int *)&a; a.setNum(5); a.setName("is my?yes"); a.printInfor(); } 執(zhí)行的過程如下圖:
可見在name值沒有數(shù)據(jù),,說明是這個對象是被銷毀,。
這個過程會出現(xiàn)一上bug,如圖:
說明這段內(nèi)存被回收了,。
但為何第一個m_Num會有值可以輸出結(jié)果,,個人認(rèn)為這個是因為我用一個指針保存了這個對象的起始地址,這里系統(tǒng)認(rèn)為有變量在使用,,所以沒有銷毀并回收,。當(dāng)然也有可能是我的方法出問題,沒有正確找到name變量的地址,。
我改變一下這個成員變量的輸出順序來驗證一下:
void Aclass::printInfor()
{ cout<<"num is "<<m_Num<<" "<<"this obj name is "<<name<<endl; } public:
string name; int m_Num; 從這個局部變量的結(jié)構(gòu)中可以發(fā)現(xiàn)系統(tǒng)會默認(rèn)的把int型變量放到string變量的前面,,這樣的話當(dāng)我們執(zhí)行addr = (unsigned long int *)&a;后,無論怎么樣調(diào)整變量的定義順序,,都只會指向同一個值即:m_Num變量,。
從結(jié)果看來name依然是沒有值,會出現(xiàn)之前的bug,,說明在沒用new的情況下對象的生命周期與普通變量的生命周期相同,,但如果是用new則不然。 |
|
來自: 昵稱14177824 > 《C 》