2011-09-23 30 views
0

Env的一个问题:VS 2008,C++关于代码异常

我有像下面的代码:

void HopeException(LPVOID nVerify) 
{ 
    char *p = NULL; 
    p = (char *)nVerify; 
    delete []p; 
} 

当我调用函数 “HopeException” 与参数不空,如:

HopeException(123); 

那么我希望程序会抛出异常。

但是,当我编译代码VS 2008版本模式,程序运行良好。

我不知道为什么。任何人都可以帮我解决这个问题吗?

或者你有什么好主意与另一种方法实现该功能?

编辑:

我很抱歉,我想我以前贴错代码。

其实,我正在为我的软件做保护。 我的软件将获得DLL文件的CRC值,然后我的软件将检查CRC值象下面这样:

unsigned int VerifyCRC = FF234322; 
    unsinged int CRC = getCRC("Fun.dll"); 
    LPVOID lpResult = CRC & (~VerifyCRC); 
    HopeException(lpResult); 

所以根据下面的代码,如果黑客破解的Fun.dll文件中,执行会抛出一个异常。
这真的是我想要的。

+3

该代码甚至不应该编译! –

+1

删除非'new'分配的数据是未定义的,所以无论发生什么都取决于实现。看起来你只是在没有爆炸的情况下幸存下来。但是,你究竟想要做什么? – birryree

+0

我不知道你在用那个代码做什么或者做什么,但是我知道的是你展示了未定义的行为。 – Marlon

回答

0

您将nVerify视为地址,并将其指定给您的指针p,然后在该地址上调用delete[]。如果nVerify的值不是有效的地址,你可能会得到未定义的行为,其中包括程序看起来“运行良好”,主要是因为你在这个函数中没有做太多的工作。

你真的想做什么?

+0

我很抱歉,我认为我发布了错误的代码,下面是正确的代码: void HopeException(LPVOID nVerify) { char * p = NULL; p =(char *)nVerify; delete [] p; } – jell

2

果冻 - C++给你足够的绳子来吊死你自己(最可能的是你们大多数人的朋友)。

但是为什么呢? ( - 假设它取决于你的朋友)。

+0

如果我是OP,这将是公认的答案。 – Anson

0

该代码不应在C++中编译;应该编译罚款最接近的事是:

void HopeException(int nVerify) 
{ 
     char *p = NULL; 
     p = (char *)nVerify; 
     delete []p; 
} 

该代码会崩溃的VS 2010速成,所以我想它也将崩溃,在VS 2008如果你的目标是直接抛出一个异常调试器(在x86上)你可以使用

__asm int 3; 

如果你的目标是打入调试器,你也可以只用

DebugBreak(); 
+0

其实,我正在为我的软件做一个检测。 我的软件会得到DLL文件的CRC值。然后我的软件会检查CRC值如下: unsigned int VerifyCRC = FF234322; unsinged int CRC = getCRC(“Fun.dll”); LPVOID lpResult = CRC&(〜VerifyCRC); HopeException(lpResult); 所以根据下面的代码,如果破解者破解** Fun.dll **文件,则执行将抛出异常。 这真的是我想要的。 – jell