2014-09-05 29 views
1

我已經在函數實現中定義了一個類。 正如你可能在下面的代碼片段中看到的,我想通過「信息」到內部類 做些事情。但是,班級中的信息得到了推崇,並且無法正常工作。 我該如何解決這個問題?變量在不同的作用域中被取消引用

感謝

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

'mUsbData.usbpath()= UsbInfo'有* putrid *香味。 – WhozCraig 2014-09-05 07:33:00

+1

'UsbThreadImpl'建議使用線程,但我沒有看到任何同步代碼('std :: mutex','std :: atomic') – Jarod42 2014-09-05 07:35:30

+0

nsRunnable有一個字段info(它隱藏了全局的) ? – Jarod42 2014-09-05 07:38:02

回答

3

您的info指針正被設置爲緩衝區的地址,該緩衝區的字面上只有足夠長的時間才能保存分配。此:

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

構造具有給定值的臨時NS_ConvertUTF16toUTF8對象,檢索其轉換緩衝地址,受讓人所述地址到info_first,則臨時對象(及其緩衝器)被破壞,留下info_first具有不確定的(因此非法評估或取消引用)地址。

可能的解決方案

std::string類型的成員變量mInfoget()的結果傳遞到直接的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;  
} 

有以外的其他方式來做到這一點,但是這是彈出到第一個我的頭。

祝你好運

+0

你的意思是mInfor.c_str(),對吧? – KimKulling 2014-09-05 08:05:29

+1

另一種解決方案是使用局部變量:'auto needUsbinfoUTF8 = NS_ConvertUTF16toUTF8(needUsbinfo)'。 – Jarod42 2014-09-05 08:28:04

+0

@WhozCraig, 通過適當修改您的草案,我的初衷是有效的。非常感謝。 – Sam 2014-09-10 03:42:01

0

在您剛剛複製的指針首位,在第二個地方,你嘗試訪問內存ADRESS指針顯示了。 請確保指針本身是有效的(例如ina調試器,並查看infor指向的內存地址是否是有效的以null結尾的字符串)。 也許你的輸入nsString只是空的? get()方法也可以只返回0,如果什麼都沒有的話?