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