打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
函数内部的对象的生存期 用new 与不用new

首先声明这篇文章内容并不新鲜,也许很多人写过类似的文章,如果有雷同的地方请不要误会,本文的确是本人原创。写这篇文章的目的只是为了让自己记得更清楚,同时公布出来希望高人指点,我这样的做法能否达到我想要说明的问题的。

进入正题:

我这篇文章是为了弄清楚在一个函数内部定义一个对象,当这个函数退出时这个对象的生存期是否就结束,还是说结束了,只是没有释放内存空间。

我的测试源码如下:

"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则不然。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一个简单的单片机直流可调稳压电源设计
如何使用ioremap函数?
c与c++分别是怎样动态分配和释放内存的,有什么区别? demo大全
C++实现线程同步的四种方式总结
基于C 实现DBSCAN聚类算法
MSP430F149模拟IIC读写24C02程序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服