MMGR问题,代码使用和线程安全

时间:2011-02-24 19:08:59

标签: c++ memory-leaks thread-safety memory-management

1)MMGR线程安全吗?

2)我希望有人可以帮我理解一些代码。我正在寻找使用宏的东西,但我不理解宏。我知道它包含一个函数调用和一个if检查,但是,该函数是一个void函数。包装“(m_setOwner( FILE ,_ LINE _, FUNCTION ),false)”如何更改返回类型?

#define someMacro (m_setOwner(__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new ...
void m_setOwner(const char *file, const unsigned int line, const char *func);

3)水库有什么意义?

4)在第770行(“void * operator new(size_t reportedSize)”中有一行 “// ANSI表示:0字节的分配请求仍将返回有效值”

在这种情况下,谁/什么是ANSI?他们是指标准吗?

5)这是更多的C ++标准,但“reportedSize”来自“void * operator new(size_t reportedSize)”?

6)这是实际进行分配所需的代码吗? “au-> actualAddress = malloc(au-> actualSize);”

1 个答案:

答案 0 :(得分:1)

1)C ++ 03标准提及线程。但是,在我知道的所有具有线程支持的平台中,默认内存分配器(newdelete)是线程安全的。

编辑:一般情况下,如果事情未标记为线程安全,则应假设它们不是,尤其是当存在隐式全局数据(例如内存管理器中的堆管理结构)时。我已经阅读了一些comments on another forum关于这个MMGR库而不是是线程安全的。

2)宏中的逗号运算符会丢弃左侧的结果,因此(m_setOwner(...), false)表达式的结果始终为false

编辑:此语法在MMGR中用于记录内存分配,然后再进行实际分配。使用逗号运算符以使new宏语法保持不变。预处理器宏是一种简单的基于文本的查找和替换机制。在代码中使用new将使用或不使用此MMGR库进行编译。就是这样,当使用MMGR时,将记录内存分配,这对于调试很有用!

3)什么是“水库”?你指的是堆?你从哪里得到这个词?

编辑:应用程序级别的内存管理器只是系统级内存管理器的前端。因此,它必须要求系统分配大页面的内存。在这种情况下,储存器似乎是预先分配一些大页面的机制的名称,以便保证接下来的几个分配成功。这主要是一种优化,因为您可以通过多个应用程序级别的分配来分摊单个(昂贵的)系统级分配的成本。

4)是的,在这种情况下,“ANSI”指的是C ++ 03标准。现在引用它的正确方法是使用ISO标准号。随意谷歌吧。

5)报告的大小由编译器设置。当你写X* x = new X(...);之类的东西时,编译器在逻辑上将其“重写”为等效形式:

X* x = static_cast<X*>(operator new(sizeof(X)));
new(x) X(...);

第一行分配足够的内存(sizeof(X)是作为reportedSize参数传递给operator new的值。第二行调用X类的构造函数在分配的内存槽中创建一个对象。

6)见#5。是的,可以在这些时间段内考虑到这一点,尽管您的平台可能无法在malloc()处于“发布”模式下调用operator new