您的位置:首页 > 其它

_BLOKC_TYPE_IS_VALID(pHead->nBlockUse)

2014-01-18 11:40 274 查看
class Test{
public:
Test(int val = 1){i = new int ; *i = val;}
~Test(){delete i;}
int getVal(){return *i;}
private:
int *i;
};
int main()
{
Test a,b(2);
a = b;
cout<<a.getVal()<<endl;
return 0;
}


运行以上代码时,出现下面的提示框:



误操作:释放栈上的空间

从提示信息看:Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)说明是内存块的类型不对。

将析构函数中的delete i;语句删除:

class Test{
public:
Test(int val = 1){i = new int ; *i = val;}
~Test(){}
int getVal(){return *i;}
private:
int *i;
};
int main()
{
Test a,b(2);
a = b;
cout<<a.getVal()<<endl;
return 0;
}
运行OK。

这是因为i这个变量是类成员变量存储在栈区,而new、malloc出来的变量存放在堆区,故而delete仅可以释放堆上的内存。栈上的内存是不需要手动来释放的。所以程序会说内存块的类型不对。

ps:一般的存储空间分配

栈和堆的区别是

栈是系统根据变量大小自动分配空间的

堆是用new,malloc等手动分配空间的

栈内存区的地址是连续的,由系统控制速度较快
堆内存区的地址是不连续的,它是系统将空闲内存块链接起来的链表

用户用new/malloc请求分配时,找到第一个满足大小要求的块从链表中删除此节点,

然后分给用户,没有栈内存速度快,但是很灵活。

栈内存是由系统自己分配和释放的,而堆内存要由程序员自己全全控制的,否则会出现内存泄露.

操作系统给程序运行的内存非了4个区域:
1 代码区:顾名思义就是存放运行的代码的
2 全局数据区:存放全局数据和静态数据以及常量.
3 栈区 函数调用时的返回地址,参数压栈,局部变量,返回数据等都存放在栈区.
4 堆区,存放程序动态分配的内存(new,malloc等函数分配的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存