首先声明这篇文章内容并不新鲜,也许很多人写过类似的文章,如果有雷同的地方请不要误会,本文的确是本人原创。写这篇文章的目的只是为了让自己记得更清楚,同时公布出来希望高人指点,我这样的做法能否达到我想要说明的问题的。
进入正题:
我这篇文章是为了弄清楚在一个函数内部定义一个对象,当这个函数退出时这个对象的生存期是否就结束,还是说结束了,只是没有释放内存空间。
我的测试源码如下:
"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;
}
//当用new生成一个对象时得到结果:
证明在函数退出后 a 对象的空间依然存在,里在面的值没有改变,这里有一个疑问:这个对象是否合法,也就是这个对象是否像局部变量一样被销毁了,但系统没有回收。(补充:我们分配了一块堆内存,那么指针a呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针a.在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中)
下面改成非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();
}
执行的过程如下图:
可见在name值没有数据,说明是这个对象是被销毁。
这个过程会出现一上bug,如图:
说明这段内存被回收了。
但为何第一个m_Num会有值可以输出结果,个人认为这个是因为我用一个指针保存了这个对象的起始地址,这里系统认为有变量在使用,所以没有销毁并回收。当然也有可能是我的方法出问题,没有正确找到name变量的地址。
我改变一下这个成员变量的输出顺序来验证一下:
void Aclass::printInfor()
{
cout<<"num is "<<m_Num<<" "<<"this obj name is "<<name<<endl;
}
public:
string name;
int m_Num;
从这个局部变量的结构中可以发现系统会默认的把int型变量放到string变量的前面,这样的话当我们执行addr = (unsigned long int *)&a;后,无论怎么样调整变量的定义顺序,都只会指向同一个值即:m_Num变量。
从结果看来name依然是没有值,会出现之前的bug,说明在没用new的情况下对象的生命周期与普通变量的生命周期相同,但如果是用new则不然。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。