首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为何release会崩溃的程序,release的调试模式却不崩溃

2012-06-20 
为什么release会崩溃的程序,release的调试模式却不崩溃。我写了一小段代码来看程序遇到非法操作的时候如何

为什么release会崩溃的程序,release的调试模式却不崩溃。
我写了一小段代码来看程序遇到非法操作的时候如何崩溃。

我new了一个C的对象,操作它的pi数组的时候故意越界,覆盖了pm指针。
因此通过pm指针调用m*对象的时候,因为this指针是非法的,所以运行崩溃了,在release模式下。

但是我发现在release模式下也可以F5调试,这种情况下无论如何也不会崩溃。我看打印出来的指针分配的大小和偏移量,和我直接release运行的值是一样的。
我知道debug模式分配内存会有很多前后保护的空间,奇怪的是为什么release模式调试的时候不会崩溃呢?

源代码如下:

C/C++ code
#include "stdafx.h"#include <algorithm>class C{public:    C(){        nCount=3;        pi=new int[1];    }    ~C(){delete [] pi;}    int *pi;    int nCount;};class my{public:    int k;    my():k(2){}    virtual int GetK(){        return k;    }};int main(void){    C* pc=new C;//new+构造函数可否带初始化列表    my* pm=new my;    auto len=std::distance(pc,(C*)pm);    printf("%p,%p,%p\n",pc,pm,&(pc->pi[len]));    pc->pi[len]=0;//覆盖了pm!    int kk=pm->GetK();//这句话会导致崩溃。但是release模式调试不崩溃,debug更不崩溃    //printf("%d\n",kk);    delete pm;    delete pc;    return 0;}



[解决办法]
可以调试,肯定有些东西会少了一些优化
[解决办法]
pc->pi[len]=0;//覆盖了pm!
楼主确定?
[解决办法]
len=std::distance(pc,(C*)pm);
这个没有问题吗?

pc->pi[len]=0;//覆盖了pm!
len确定为0?

热点排行