您的位置:首页 > 其它

类的内存存储区域

2013-06-25 11:22 246 查看
众所周知,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_Me
4000
mory.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创建的,则类的内部数据存储区域再根据栈申请还是堆申请来对待。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存 存储 new