2011-10-02 75 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报告中解决。谢谢! –

相关问题