Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;函数任意存在_C++ - Fatal编程技术网

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:实例是否为空?