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