代码之家  ›  专栏  ›  技术社区  ›  Sam

变量在不同的作用域中被取消引用

c++
  •  1
  • Sam  · 技术社区  · 11 年前

    我在函数实现中定义了一个类。 正如您在下面的代码段中看到的,我想将“info”传递给内部类 做点什么。然而,类中的信息被延迟,无法正常工作。 如何解决此问题?

    谢谢

    static const char* info;
    
    bool
    UsbThreadImpl::RecvEnableUsbInfo(const nsString& needUsbinfo)
    {
      const char* info_first = NS_ConvertUTF16toUTF8(needUsbinfo).get();
      info = info_first; //< ----this works okay
    
      class UsbRunnable2 MOZ_FINAL : public nsRunnable
      {
    
      public:
        UsbRunnable2(UsbThreadImpl* UsbPointer, const char* UsbInfo)
        {
          mUsbData.usbpath() = UsbInfo;
          mUsbPointer = UsbPointer;
        }
    
    
        NS_IMETHOD Run()
        {
          printf("\n===In Runnable2 UsbInfo: %s\n", info); //< -- - this one is broken
          return NS_OK;
        }
    
      private:
        UsbThreadImpl* mUsbPointer;
        const char* RecvUsb;
      };
    
      nsCOMPtr<nsIRunnable> runnable = new UsbRunnable2(this, mUsbInfo);
    
      return true;
    }
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   WhozCraig    11 年前

    你的 info 指针被设置为一个缓冲区的地址,该地址实际上只有效到足以保存分配。这:

    const char *info_first = NS_ConvertUTF16toUTF8(needUsbinfo).get();
    

    构造临时 NS_ConvertUTF16toUTF8 对象,检索其转换缓冲区地址,将所述地址分配给 info_first ,然后销毁临时对象(及其缓冲区) 信息_第一 地址不确定(因此对eval或解引用是非法的)。

    可能的解决方案

    创建成员变量 mInfo 类型的 std::string 并传递 get() 直接发送到的构造函数 UsbRunnable2 作为第三参数。该临时文件将保存足够长的时间,以便在构造函数中创建副本,从而宣传您自己的副本 信息 围绕(注意:我不知道你在用第一个和第二个做什么,但这会让你接近):

    bool UsbThreadImpl::RecvEnableUsbInfo(const nsString& needUsbinfo)
    {
    
        class UsbRunnable2 MOZ_FINAL : public nsRunnable
        {
        public:
            UsbRunnable2(UsbThreadImpl* UsbPointer,
                         const char* UsbInfo,
                         const char* Info)
                : mUsbPointer(UsbPointer)
                , mUsbInfo(UsbInfo)
                , mInfo(Info)
            {
            }
    
            NS_IMETHOD Run()
            {
                printf("\n===In Runnable2 UsbInfo: %s\n", mInfo.c_str());
                return NS_OK;
            }
    
        private:
            UsbThreadImpl* mUsbPointer;
            std::string mUsbInfo, mInfo;
        };
    
        nsCOMPtr<nsIRunnable> runnable =
            new UsbRunnable2(this, mUsbInfo, NS_ConvertUTF16toUTF8(needUsbinfo).get());
    
        return true;    
    }
    

    还有其他方法可以做到这一点,但这是我第一个想到的。

    祝你好运

        2
  •  0
  •   KimKulling    11 年前

    在第一个位置,您刚刚复制了指针,在第二个位置,尝试访问指针显示的内存地址。 请确保指针本身是有效的(例如,在调试器中,查看信息所指向的内存地址是否为有效的以空结尾的字符串)。 也许您的输入nsString只是空的?get()-方法也可以只返回0,如果没有任何内容?