我在一个函数里定义了一个局部变量,然后让他返回,然而在Debug时会提示变量的指针有冲突(只是一个单纯的bool类型的返回,貌似没有指针),然而在release下没有问题。不知道为什么,查了相关局部变量返回的知识但感觉都不是很明确,请教各位大大了
我程序大致是这样的:
bool fun1()
{
    bool bIsSuccess = funOut();
    return bIsSuccess;
}
因为变量返回的时候是复制返回值给要接受的变量,所以我感觉即使局部变量销毁,它的值也被复制了呀,不应该有问题啊,出现错误时时在return bIsSuccess;的时候,然而出现错误后继续运行,程序还是会运行下去= =
只有这么点分了,请笑纳~

解决方案 »

  1.   

    int、bool、double等基本类型都可以直接返回
    结构体、char *就不行了
      

  2.   

    Run-Time Check Failure #2 - Stack around the variable vbIsSuccess was corrupted.
    其中vbIsSuccess 是VARIANT_BOOL类型
      

  3.   

    Run-Time Check Failure #2 - Stack around the variable vbIsSuccess was corrupted.
    其中vbIsSuccess 是VARIANT_BOOL类型
      

  4.   

    Run-Time Check Failure #2 - Stack around the variable vbIsSuccess was corrupted.
    其中vbIsSuccess 是VARIANT_BOOL类型
      

  5.   

    funOut()有问题。比如它的调用方式不对(原本是C call,编译器误认为是stdcall 等等)导致堆栈没有配平而被debug版的CheckStack()检测出来,release版因没有堆栈检测函数,所以未报错
      

  6.   

    这个倒是有可能,可是我的funout函数是一个com接口,通过InvokeHelp来对相应函数进行调用,而且返回值本身的值都是正确的,不过会出现那种问题是不是com编译时的调用方式和现在的程序不匹配呢??如果必须匹配的话一定要改成一致的么???
      

  7.   


    具体问题需要具体分析,COM接口一般都是stdcall,即this 指针会当作堆栈参数push进去而不是放在ecx中,这样在funout运行结束时就可能导致vbIsSuccess 的堆栈被覆盖而破坏。最好用windbg跟一下就清清楚楚了。
      

  8.   

    windbg??没用过你说的那个东东,能简单告诉我怎么用吗,麻烦的话我就自己琢磨下。
      

  9.   

    既然能debug,就调试看看是什么原因咯。是不是dll的导出函数来的?如果是的话检查相关的修饰词
      

  10.   


    同感,感觉是funout本身实现中的问题
      

  11.   

    windbg 是微软的windows程序的调试器啊,没听说过?。。
    可以在微软的官方网站上下载的,用法的话只能靠你自己去钻研一下了。。
      

  12.   

    我看了下我用的调用设置时cdecl,程序和dll中都是用一样的,而同样把两个改成stdcall的话还是会出现刚才的问题迷茫了,这说明不是调用方式的问题么???
      

  13.   

    相关修饰语是指什么呢???
    原先的函数单独在程序中跑没有任何问题,然而现在封成DLL并增加了VARIANT_BOOL返回值后就出现问题了,主要是我挺肯定函数没什么问题的呢
      

  14.   

    我也觉得好诡异,如果funout可以返回,而且bool类型的接收也没有问题那会是什么问题呢??
      

  15.   

    bIsSuccess  = ((HRESULT (__stdcall *)())funOut)()试试
    不然就
    bIsSuccess  = ((HRESULT (__stdcall *)(unsigned long int))funOut)(0)试试
      

  16.   

    有错就在funOut()函数了,它的返回值是什么类型
      

  17.   

    我这么说一下吧
    VARIANT_BOOL funout()
    {
        ....
        return VARIANT_TRUE;
    }当然这个函数存在与COM的DLL中。
    而我的程序中用如下方式进行调用
    void fun1()
    {
        VARIANT_BOOL vbIsSuccess;
    try
    {
        vbIsSuccess = m_Dispatch.InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&vbIsSuccess, NULL); 
    }
    catch(CException *e)
    {
        e->ReportError();
        e->delete();
    }
        return vbIsSuccess;
    }
    调用InvokeHelper并获得的vbIsSuccess值都没有问题,但是debug单步调试到函数的最后一个右括号时出现上述错误悲剧~~
      

  18.   

    finout 所在组件是你做的?
      

  19.   

    把 try{} catch{} 结构去掉,再试一下
      

  20.   

    m_Dispatch.InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&vbIsSuccess, NULL);
    可能有问题。而不是局部变量。
      

  21.   

    在工程属性中看看 调用约定是不是__stdcall,vc默认是 __cdecl的。
      

  22.   

    funOut();
    返回什么值啊?是不是在
    #if define _DEBUG
    下?
      

  23.   

    但感觉没有什么问题啊。。不过确实把vbIsSuccess改程类成员就不会出错了,但是我还是想知道为什么。。而且没必要改成类成员的说。
      

  24.   

    bool fun1()
    {
      bool bIsSuccess = funOut();
      return bIsSuccess;
    }
    信息不够,起码给个funOut()声明
      

  25.   


    func1 是 void 型的,结果最后却返回值?
      

  26.   

    另外,需要注意一下,VARIANT_BOOL 是 -1 即 0xFFFFFFFF 表示“真”,0 表示“假”