首先,至少有 4-5 个主题与 SO 上的主题相似。我阅读了它们中的每一个,但我觉得它们并没有真正帮助我解决这个特定问题。如果其他人发现重复的问题,我深表歉意。在发布此之前,我已经完成了我的搜索,因为这似乎是一个非常常见的问题。
我在 Windows 7 上使用 Visual Studio .NET 2003。
我有自己的 new/delete 重载,指向我自己对 malloc() 和 free() 的自定义调用以进行诊断。我的新/删除重载在一个头文件中,我已经包含在几个文件中。
问题是,代码库几乎是意大利面条,没有简单的方法可以确保所有东西都使用这些重载。第三方库包含黑盒。我们也到处使用 STL。
在我的测试中,我发现 STL 仍在混合调用我自己的 new/delete 和标准的 MSVC new/delete 调用。
将我的头文件包含在数以千计的其他文件中似乎并不现实,这将花费太长时间。谁能提供一些关于如何正确有效地全局重载 new/delete 以便一切都使用我的自定义内存管理器的提示?
最佳答案
这不是它的工作原理。您替换这两个运算符,这是在 link 时完成的。您需要做的就是编写一个定义这些运算符并将其链接到组合中的单个 TU。没有其他人需要知道这一点:
// optional_ops.cpp
void * operator new(std::size_t n) throw(std::bad_alloc)
{
//...
}
void operator delete(void * p) throw()
{
//...
}
原则上,不需要任何头文件来声明这些函数(operator new
、operator delete
),因为这两个函数的声明已经被硬编码到语言中,如果你将要。但是,名称 std
, std::bad_alloc
和 std::size_t
没有预先声明,所以你可能想要包含<new>
或其他一些标题来提供这些名称。
在 C++11 及更高版本中,您也可以使用 decltype(sizeof(0))
以不需要任何类型的库的方式获取第一个参数的大小。 C++11 也有一个更简单的异常模型,没有动态异常规范(最终在 C++17 中完全从语言中删除)。
void * operator new(decltype(sizeof(0)) n) noexcept(false)
{
//...
}
关于c++ - 如何正确替换全局new和delete运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8186018/