1.关于变量的内存开辟问题
http://topic.csdn.net/u/20070927/11/cfc316cb-2c6b-41eb-b318-473e8a328409.html
比如下面的例子:
int i=5; //这个变量i的空间应该是在栈上,不需要手动释放
int *k = new int(5) //这个变量k的空间应该是在堆上开辟, 不用了的时候需要手动释放.
上面是我对定义一个整型变量的两种方式的理解, 不知道有没有错误?
但是关于struct/class 这种类型的内存开辟问题我还是很糊涂.
我知道关于链表之类的动态的结构,内存开辟是必须用new /alloc等在堆上进行.但是普通的struct/class 呢? 比如说下面两种不同的方式
方式1:
struct test
{ int a;
int b;
};
test *testObj = new test();
testObj-> a =1;
testObj-> b =2;
方式2:
struct anotherTest
{ int a;
int b;
};
anotherTest anotherTestObj;
anotherTestObj.a=1;
anotherTestObj.b=2;
问题: 1: 方式2这种定义方法有没有问题?是不是在栈上分配内存? 如果该struct/class很大,超出了栈的大小怎么办?
2. 如果上面的方式2的写法没有问题, 如果struct/class中有动态指针(比如链表)的成员,是不是这样写就会有问题?
3.方式1和方式2的区别?
******************************************************************************************
int *k = new int(5);
指针变量 k 的空间在栈上, 在32位机器上指针变量大小4字节
指针变量k所存储的4字节地址所指向到空间在堆上,类型为 int 大小为 4 * sizeof(int);
A:方式1在在栈上分配一个test型指针变量.只占用栈4个字节(如果是在32位机的情况下^_^).这个变量指向一个在堆中分配的test型结构体.所以在程序结束时如果不显式的delete testObj.那么这个在栈中的指针变量虽然被自动删除.但为其在堆中分配的test结构并没有被销毁.内存于是泄漏...
方式2在栈上分配一个anothertest变量.这个变量占栈的大小为sizeof(anothertest)个字节.和堆没有关系.所以这个变量所占用的栈空间在程序结束时会被自动删除.
2.指针与数组的问题