c++ - 变量在不同的范围内被取消引用

标签 c++

我在函数实现中定义了一个类。 正如您在以下代码片段中看到的,我想将“信息”传递给内部类 做某事。但是,类中的信息被引用并且无法正常工作。 我该如何解决这个问题?

谢谢

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;
}

最佳答案

您的 info 指针被设置为一个缓冲区的地址,该缓冲区的字面意思是只有足够长的时间才能保存分配。这:

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

构造一个具有给定值的临时NS_ConvertUTF16toUTF8对象,检索其转换缓冲区地址,将所述地址分配给info_first,然后临时对象(及其缓冲区)是销毁,留下 info_first 一个不确定的(因此评估或取消引用是非法的)地址。

可能的解决方案

创建一个类型为std::string的成员变量mInfo,并将get()的结果直接传递给的构造函数code>UsbRunnable2 作为第三个参数。临时文件将存在足够长的时间以在构造函数中创建一个拷贝,从而四处宣传您自己的 info 拷贝。 (注意:我不知道你在用第一个和第二个做什么,但这应该让你接近):

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;    
}

还有其他方法可以做到这一点,但这是第一个突然出现在我脑海中的方法。

祝你好运

关于c++ - 变量在不同的范围内被取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25680653/

相关文章:

c++ - 模板别名范围

c++ - C/C++ 运行时多维动态数组

c++ - 通过父类(super class)的引用访问派生类

c++ - C++ 的通用线程 C 包装器函数

c++ - 如何在不等待的情况下使用 future ?

c++ - ClangTool如何在变量声明中获取模板参数的位置?

c++ - 回调与 lambda

c++ - OpenCV 错误 : Assertion failed (vc_. isOpened()) 复位

c++ - 错误 : could not convert ‘((const MyClass*)this)->MyClass::myLabel’ from ‘QLabel* const’ to ‘QLabel’

c++ - CreateProcess 忽略 lpCurrentDirectory/父工作目录