2012-09-27 26 views
2

我想知道這是什麼呢:basic_string的分配器

std::basic_string<char, std::char_traits<char>, std::allocator<char>>:: 
basic_string<char, std::char_traits<char>, std::allocator<char>> 
(&myText, "hello world"); 

我的第一個猜測是,它的分配的「Hello World」的myText變量 如果那麼這是什麼在這種情況下,這樣做是正確的:

if (v106 == v67 || 
    std::basic_string<char, std::char_traits<char>, std::allocator<char>>:: 
    basic_string<char, std::char_traits<char>, std::allocator<char>> 
    (&v109,"program"), v137 = 1) 
    { 
    BYTE3(v95) = 0; 
    } 

它不是一個真正的狀態...

+2

你的代碼有些東西被弄壞了。這是無效的C++。也許你在某處失去了一些線路? –

+2

你從哪裏得到這段代碼?\ –

+1

什麼是'char_std'?這是一種要求真實代碼的稍微粗魯的方式。 –

回答

3

我想這是輸出六角雷的反編譯器插件IDA,是嗎?這是它顯示std::string類的構造函數調用的方式。 v109是在堆棧中分配的內存以存放std::string實例,而第二個參數"hello world"是用於初始化它的字符串。

在多個條件導致相同的結果代碼的情況下,編譯器通常會選擇重用先前條件中的(等效)代碼片段來最小化生成的字節代碼的大小。 Hex-Ray的反編譯器插件通常使用Comma-operator直到版本1.5顯示它們 - 新版本的反編譯器有a better understanding of such situations

if (v106 == v67) 
    BYTE3(v95) = 0; 

std::basic_string<char, std::char_traits<char>, 
        std::allocator<char>> 
        ::basic_string<char, 
         std::char_traits<char>, 
         std::allocator<char>>(&v109,"program"); 
v137 = 1; 
BYTE3(v95) = 0; 

這很可能看起來像實際的來源。用簡單的std::string聲明替換巨大的std::basic_string<...>構造使其更具可讀性。

if (v106 == v67) 
    BYTE3(v95) = 0; 

std::string v109("program"); 
v137 = 1; 
BYTE3(v95) = 0; 
+0

謝謝是啊,這就是我的想法,但在「如果」分配文本的變量不是一個條件,據我所知... – MeeKaaH

+0

我剛剛編輯我的答案,以更好地適合您的問題。 ;) – athre0z

+0

非常感謝,現在很清楚:) – MeeKaaH