C++ C++;函数任意存在
我有一个奇怪的问题:C++ C++;函数任意存在,c++,C++,我有一个奇怪的问题: 在我的Win32 C++应用程序中,我有一个函数,在调用另一个函数后函数返回。 void f() { //SECTION 1// if( interactFrame ) { psFrame->getWindow()->deactivate(); interactFrame = activeFrame = 0; logFile << "PS deactive" <<
在我的Win32 C++应用程序中,我有一个函数,在调用另一个函数后函数返回。
void f()
{
//SECTION 1//
if( interactFrame )
{
psFrame->getWindow()->deactivate();
interactFrame = activeFrame = 0;
logFile << "PS deactive" << endl;
}
//SECTION 2//
}
void Window::deactivate()
{
SetLayeredWindowAttributes( handle_, 0, 0, LWA_ALPHA );
SetFocus( applicationWindow_ );
}
void f()
{
//第一节//
如果(交互帧)
{
psFrame->getWindow()->deactivate();
interactFrame=activeFrame=0;
日志文件听起来像是有什么东西(很可能是去激活
,或者它调用的东西)把堆栈弄得一团糟(例如,覆盖缓冲区的结尾)并弄乱了返回地址。不过,比这多得多的是一个相当疯狂的猜测。听起来像是什么东西(很可能是停用
,或它调用的某个东西)造成堆栈混乱(例如,覆盖缓冲区的结尾)并且弄乱了返回地址。不过,这可能是一个相当疯狂的猜测。根据您的描述,听起来您仍然会遇到空的解引用错误。请稍微保护一下您的代码,看看会发生什么情况:
if( interactFrame )
{
if (psFrame)
{
if (psFrame->getWindow())
{
psFrame->getWindow()->deactivate();
}
// else log("getWindow == null")
}
// else log("psFrame == null")
interactFrame = activeFrame = 0;
logFile << "PS deactive" << endl;
}
if(交互帧)
{
if(psFrame)
{
如果(psFrame->getWindow())
{
psFrame->getWindow()->deactivate();
}
//else日志(“getWindow==null”)
}
//else日志(“psFrame==null”)
interactFrame=activeFrame=0;
日志文件根据您的描述,听起来您仍然会遇到空的解引用错误。请稍微保护您的代码,看看会发生什么情况:
if( interactFrame )
{
if (psFrame)
{
if (psFrame->getWindow())
{
psFrame->getWindow()->deactivate();
}
// else log("getWindow == null")
}
// else log("psFrame == null")
interactFrame = activeFrame = 0;
logFile << "PS deactive" << endl;
}
if(交互帧)
{
if(psFrame)
{
如果(psFrame->getWindow())
{
psFrame->getWindow()->deactivate();
}
//else日志(“getWindow==null”)
}
//else日志(“psFrame==null”)
interactFrame=activeFrame=0;
日志文件我猜这行
psFrame->getWindow()->deactivate();
只生成一个异常。而您的函数根本不会返回-它会以异常终止。要确认这一点,请在调用f()
函数(其中一部分是您发布的代码)后设置一个断点,如果该断点没有命中,则可能是异常(可能是无效的内存访问或简单的C++异常抛出)。
堆栈损坏也是可能的,它也可能导致异常(除非您意外地用可执行内存的有效地址覆盖返回地址)
另外请注意,如果psFrame
恰好是0(或其他无效指针),那么如果getWindow()
以任何方式访问其对象的任何非静态成员,则保证异常。您将完全看到您描述的行为。当psFrame->getWindow()
返回0(或另一个无效指针)时,情况也是一样的和deactivate()
访问非静态成员
UPD:
调试时,您还可以跟踪堆栈内容的更改。我猜这行
psFrame->getWindow()->deactivate();
只生成一个异常。而您的函数根本不会返回-它会以异常终止。要确认这一点,请在调用f()
函数(其中一部分是您发布的代码)后设置一个断点,如果该断点没有命中,则可能是异常(可能是无效的内存访问或简单的C++异常抛出)。
堆栈损坏也是可能的,它也可能导致异常(除非您意外地用可执行内存的有效地址覆盖返回地址)
另外请注意,如果psFrame
恰好是0(或其他无效指针),那么如果getWindow()
以任何方式访问其对象的任何非静态成员,则保证异常。您将完全看到您描述的行为。当psFrame->getWindow()
返回0(或另一个无效指针)时,情况也是一样的和deactivate()
访问非静态成员
UPD:
调试时,您还可以跟踪堆栈内容的更改。如果您添加停用代码,这可能会很有用。此外,您的程序是否正常退出?您是在发布模式还是调试模式下生成的?在发布和调试模式下,它都不会更进一步。它确实正常退出。我添加了停用(),这只是两个win32调用。handle_uu和applicationWindow_u都是好的变量。你的意思是说psFrame==NULL
但是psFrame->getWindow()
不访问psFrame
的任何非静态成员,实际上返回指向有效对象的指针吗?你有没有跳过deactivate()
function?如果您添加停用代码,可能会很有用。此外,您的程序是否正常退出?您是在发布模式还是调试模式下生成的?在发布和调试模式下都不会进一步。它确实正常退出。我添加了停用(),这只是两个win32调用。handle_uu和applicationWindow_u都是好的变量。你的意思是说psFrame==NULL
但是psFrame->getWindow()
不访问psFrame
的任何非静态成员,实际上返回指向有效对象的指针吗?你有没有跳过deactivate()
function?@DD:实例是否为空?@DD:实例是否为空?