变量在不同的范围内被解除引用

时间:2014-09-05 07:27:06

标签: c++

我在函数实现中定义了一个类。 正如您在下面的代码片段中看到的那样,我想通过" 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 个答案:

答案 0 :(得分:3)

您的info指针被设置为缓冲区的地址,该缓冲区实际上只有足够长的时间才能保存赋值。这样:

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

使用给定值构造临时NS_ConvertUTF16toUTF8对象,检索其转换缓冲区地址,将所述地址分配给info_first,然后销毁临时对象(及其缓冲区),留下{{1带有不确定的(因此非法到eval或dereference)地址。

可能的解决方案

创建info_first类型的成员变量mInfo,并将std::string的结果直接传递给get()的构造函数作为第三个参数。临时用户将活得足够长,可以在构造函数中创建一个副本,从而宣传你自己的UsbRunnable2副本。 (注意:我不知道你和第一个和第二个做了什么,但这应该让你接近):

info

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

祝你好运

答案 1 :(得分:0)

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

相关问题