众所周知,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创建的,则类的内部数据存储区域再根据栈申请还是堆申请来对待。