久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

函數(shù)內(nèi)部的對象的生存期 用new 與不用new

 昵稱14177824 2013-10-23

首先聲明這篇文章內(nèi)容并不新鮮,,也許很多人寫過類似的文章,,如果有雷同的地方請不要誤會,本文的確是本人原創(chuàng),。寫這篇文章的目的只是為了讓自己記得更清楚,,同時公布出來希望高人指點,我這樣的做法能否達(dá)到我想要說明的問題的,。

進(jìn)入正題:

我這篇文章是為了弄清楚在一個函數(shù)內(nèi)部定義一個對象,,當(dāng)這個函數(shù)退出時這個對象的生存期是否就結(jié)束,還是說結(jié)束了,,只是沒有釋放內(nèi)存空間,。

我的測試源碼如下:

"Aclass.h"

*******************************************************

#pragma once
#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;


class Aclass
{
public:
 Aclass(void);
 ~Aclass(void);

public:
 int m_Num;
 string name;
 void setName(string strname);
 void setNum(int num);
 void printInfor();
};

**************************************************
#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則不然。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多