类的内存存储区域

众所周知,new出来的变量,申请的内存都是存储在堆区;

理论上来说是这样子的,但是有时候看到int i ,千万不要脱口而出是栈内存,因为不一定,尤其在c++类中,需要重点注意。

代码如下:

class CLS_Memory
{
    public:
        CLS_Memory();
        ~CLS_Memory();
        void PrintAddress();
    private:
        char m_mem1[256];  //m_mem1,应该存储在栈区还是堆区?应该考虑每个类对象是如何创建的。

        char* m_pMem2 ;     //
};

#include "CLS_Memory.h"
CLS_Memory::CLS_Memory()
{
    m_pMem2 = new char[200];//毋庸置疑,m_pMem2指向内存是堆内存。
}
CLS_Memory::~CLS_Memory()
{
   
}
void CLS_Memory::PrintAddress()
{
    printf("m_mem1 Address is %0X .\n", m_mem1);
    printf("m_pMem2 self Address is %0X .\n", &m_pMem2);
    printf("m_pMem2 point Address is %0X .\n", m_pMem2);
}
int main(int argc, char* argv[])
{
    CLS_Memory m1;
    m1.PrintAddress();
    printf("m1 address = %0X \n", &m1);
    printf("===============================\n");
    CLS_Memory *m2 = new CLS_Memory();
    m2->PrintAddress();
    printf("m2 address = %0X \n", &m2);
    printf("m2 point address = %0X \n", m2);
    return 0;
}

编译后,运行结果如下:

[root@localhost src]# g++ -g -o Memory CLS_Memory.cpp
[root@localhost src]# ./Memory
m_mem1 Address is BFB009E8 .  

//m_mem1变量在栈内存中,类大小为256 + 4 = 260 = 0x104


m_pMem2 self Address is BFB00AE8 .

 //m_pMem2指针变量本身在栈内存中


m_pMem2 point Address is 8CB0008 .

//m_pMem2指针变量指向的内存本身在堆内存中


m1 address = BFB009E8 

//栈内存中


===============================
m_mem1 Address is 8CB00D8 . 

 // 这可以看出来是在堆内存中

 

m_pMem2 self Address is 8CB01D8 .

//m_pMem2指针变量本身在堆内存中 8CB01D8 = 8CB00D8+hex(256)

 

总结:

如果一个类对象是new出来的,则类的内部所有数据都存储在堆区。

如果一个类对象是非new创建的,则类的内部数据存储区域再根据栈申请还是堆申请来对待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值