test dword ptr [eax],eax ; probe page. 是怎么回事?

【问题描述】

编译时没有错误,但是调试或者运行时程序就报错了!一脸懵逼~~

debug调试提示:

xxx.exe 中的 0x00e731d7 处未处理的异常: 0xC00000FD: Stack overflow

原来是栈溢出了!

【问题为何会出现】

局部变量的申请空间是存放于栈中,windows里默认栈内存是1M,所以当申请空间大于1M时就会出现溢出错误。

【解决方案】

1、扩大栈空间的大小,在vs工程里面:项目->属性->链接器->系统->堆栈保留大小(注:这里填的是字节数)

        如果你想把他扩大为2M的话,1024*1024*2 = 2097152

2、局部变量不要申请超过1M的空间。

把这种申请内存的方式

BYTE pBuffer[4096];

改为:

BYTE *lpBuffer = (BYTE*)VirtualAlloc(0, dwFileSize, MEM_COMMIT, PAGE_READWRITE);

最后别忘释放内存:

 VirtualFree(lpBuffer, 0, MEM_RELEASE);

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
shared_ptr(智能指针)举例 程序使⽤动态内存出于以下三种原因之⼀ : 1、程序不知道⾃⼰需要多少对象; 2、程序不知道所需对象的准确类型; 3、程序需要在多个对象间共享数据 ⼀. 要确保⽤ new 动态分配的内存空间在程序的各条执⾏路径都能被释放是⼀件⿇烦的事情。 11 模板库的 <memory> 头⽂件中定义的智能, 即 shared _ptr 模板,就是⽤来部分解决这个问题的。 只要将 new 运算符返回的指针 p 交给⼀个 shared_ptr 对象"托管",就不必担⼼在哪⾥写delete p语句——实际上根本不需要编写这条 语句,托管 p 的 shared_ptr 对象在消亡时会⾃动执⾏delete p。⽽且,该 shared_ptr 对象能像指针 p —样使⽤,即假设托管 p 的 shared_ptr 对象叫作 ptr,那么 *ptr 就是 p 指向的对象。 通过 shared_ptr 的构造函数,可以让 shared_ptr 对象托管⼀个 new 运算符返回的指针,写法如下: 此后,ptr 就可以像 T* 类型的指针⼀样使⽤,即 *ptr 就是⽤ new 动态分配的那个对象。 多个 shared_ptr 对象可以共同托管⼀个指针 p,当所有曾经托管 p 的 shared_ptr 对象都解除了对其的托管时,就会执⾏delete p。 初始化: 例1 例2 只有指向动态分配的对象的指针才能交给 shared_ptr 对象托管。将指向普通局部变量、全局变量的指针交给 shared_ptr 托管,编译时不 会有问题,但程序运⾏时会出错,因为不能析构⼀个并没有指向动态分配的内存空间的指针。 ⼆. shared_ptr与make_shared的区别 make_shared 在动态内存中分配⼀个对象并初始化它,返回指向此对象的shared_ptr,与智能指针⼀样,make_shared也定义在头⽂件 memory中。 当要⽤make_shared时,必须指定想要创建的对象类型,定义⽅式与模板类相同,在函数名之后跟⼀个尖括号,在其中给出类型。 如 std::shared_ptr<int> p1 = std::make_shared<int>(66); ⼀般采⽤auto定义⼀个对象来保存make_shared的结果,如 auto p2 = std::make_shared<int>(88); 例

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值