_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等函数分配的)
相关文章推荐
- VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩溃原因及解决方法
- _BLOCK_TYPE_IS_VALID(pHead->nBlockUse问题解析
- _BLOCK_TYPE_IS_VALID(phead->nBlockuse)错误
- VS _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
- _BLOCK_TYPE_IS_VALID(pHead->nBlockUse
- VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩溃原因及解决方法 .
- C++ error:Debug Assertion Failed.Expression:_BLOCK_TYPE_IS_VALID(phead->nBlockUse)
- 误操作:释放栈上空间 Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
- 关于VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))的相关问题解决办法
- [转]VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩溃原因及解决方法
- _BLOCK_TYPE_IS_VALID(pHead->nBlockUse - 内存越界或重复释放
- 函数运行到结尾 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse
- Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
- _BLOCK_TYPE_IS_VALID(pHead->nBlockUse
- 解决VS中出现_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))的问题
- [wxWidgets]_[初级]_[Debug Assertion Failure: BLOCK_TYPE_IS_VALID(pHead->nBlockUse) ]
- _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
- Qt 程序退出时断言错误——_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),由setAttribute(Qt::WA_DeleteOnClose)引起
- [wxWidgets]_[初级]_[Debug Assertion Failure: BLOCK_TYPE_IS_VALID(pHead->nBlockUse) ]
- 【Debug】_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));