2012-10-17 76 views
2

我有一個非常簡單的類存根 - 我剛開始做它:我真的這樣愚蠢:此= 0x7ffffffe

class CJSScript 
{ 
public: 
    CJSScript(std::string scriptfile); 
    ~CJSScript(void); 
private: 
    std::string scriptname; 
}; 
CJSScript::CJSScript(std::string scriptfile) 
{ 
    size_t found = scriptfile.find_last_of("/\\"); 
    scriptname = scriptfile.substr(found+1); 
    printf("should load %s now...", scriptname); 

} 

然而,在該構造我得到一個異常,this顯然被設置爲0x7ffffffe

主程序

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CJSScript* test=new CJSScript("./script/test.js"); 
    system("pause"); 
    return 0; 
} 

這到底是怎麼回事。我以爲自己很久以前就有基礎知識,但這是一種妥協。我的或編譯器:)

調試轉儲:

Win32Project3.exe!_output_l(_iobuf * stream, const char * format, localeinfo_struct * plocinfo, char * argptr) Line 1649 C++ 
Win32Project3.exe!printf(const char * format, ...) Line 62 C 
Win32Project3.exe!CJSScript::CJSScript(std::basic_string<char,std::char_traits<char>,std::allocator<char> > scriptfile) Line 11 C++ 
Win32Project3.exe!wmain(int argc, wchar_t * * argv) Line 38 C++ 
Win32Project3.exe!__tmainCRTStartup() Line 240 C 
+0

可能是一個調用約定相關的錯誤。在某物上使用錯誤的調用約定會產生非常奇怪的副作用。 – cdhowie

+1

你得到的例外究竟是什麼? – Florian

+8

'printf'來自C和期望一個'爲const char *'爲字符串,而不是一個'的std :: string' – dyp

回答

6

printf不知道如何處理string對象。您需要通過const char*

printf("should load %s now...", scriptname.c_str()); 

這是一個類型安全問題。出於這個原因,除其他外,我更喜歡使用流。

cout << "should load " << scriptname << " now..."; 
+0

哦。我不是習慣使用'printf'我喜歡'cout':P所以,這在構造函數應該是'0x7ffffffe'? :d THX,將接受 – n00b

+1

由於傻冒傳遞'string'到'printf',但'printf'就像一個'爲const char *'對待它,但毫無疑問的東西'printf'回事,喚起未定義行爲。如果是這樣,那麼肯定 - 它可以將this設置爲0x7fffffff。 –

+0

@的n00b:'this'可以在良好限定的程序的多個值之一,其中可能包括確切位模式。它將是由'new'表達式調用的分配器返回的地址,並且超出了您的控制範圍。在這種情況下,因爲您有未定義的行爲,它可能已被覆蓋,並可能包含任何隨機值。 –