2011-10-02 39 views
8

更新:以下問題似乎取決於-fwhole-program選項。std :: string如何通過-fwhole-program在GCC中分配內存?

我一直在玩弄內存分配了一下,我遇到了一個小謎團:在GCC(4.6),如何std::string分配內存[編輯]當我-fwhole-program編譯[/]?

有這個以下測試程序:

#include <new> 
#include <string> 
#include <iostream> 
#include <cstdlib> 

void * operator new(std::size_t n) throw(std::bad_alloc) 
{ 
    void * const p = std::malloc(n); 

    if (p == NULL) throw std::bad_alloc(); 

    std::cerr << "new() requests " << n << " bytes, allocated at " << p << ".\n"; 

    return p; 
} 

void operator delete(void * p) noexcept 
{ 
    std::cerr << "delete() at " << p << ".\n"; 
    std::free(p); 
} 

int main() 
{ 
    std::string s = "Hello world."; 
} 

當我使用任何其他動態容器(使用std::allocator<T>),分配器可使用::operator new,所以我愉快地看到調試消息。然而,與std::string,我什麼都看不到。我相信動態分配會發生,但是,我可以用valgrind(13加字符串長度字節分配)來確認。我經歷了幾個源文件和標準,我很確定該模板是std::basic_string<T, std::char_traits<T>, std::allocator<T>>,所以我不知道爲什麼我看不到來自我替換的分配函數的消息。

任何人都可以解釋這個難題嗎?我該如何追蹤字符串分配?另外,任何人都可以通過其他編譯器運行它,看看它是否產生任何輸出?

(例如:如果我添加std::map<int, int> m { { 0, 1 } };,我有輸出new() requests 24 bytes, allocated at 0x8d53028等)

+0

小心小緩衝區優化。 –

+0

更新:如果我用'-fwhole-program'編譯,問題纔出現(在GCC 4.6.1和4.4.3中)! –

+0

FWIW:我在調試或優化模式下使用64位g ++ 4.5.2從您的自定義新建中獲取輸出。 –

回答

4

綜觀g++ ... -S與/輸出,而不-fwhole-program看來,整個定製新/ delete操作符不發出的所有當使用fwhole-program

我開始懷疑我們正在尋找一個bug。

+0

謝謝!也許我會把這個文件作爲一個bug,我們可以看看是否有開發人員可以證實這一點。 –

+0

這是奇怪的,雖然與任何其他容器運營商*會*使用! –

+0

它現在正在bug報告中解決。謝謝! –