为什么重载运算符不与 std::string 一起使用 msvc /MD 标志
Why doesn't overloading operator new with std::string work with msvc /MD flag
我有一些看起来像这样的代码。
#include <iostream>
#include <string>
void* operator new(std::size_t n){
std::cout << "[Allocating " << n << "bytes] ";
return malloc(n);
}
void operator delete(void* pointer) throw() {
free(pointer);
}
int main(){
for(int i = 0; i < 24; i++){
std::cout << i << ": " << std::string(i, '=') << std::endl;
}
}
它使用 gcc 编译器编译和运行,并且在使用带有标志/MT 或/MTd 的 MSVC 编译器时也运行。 但是,如果我将标志设置为/MDd 或/MD,程序就会崩溃。它似乎卡在新运算符内部的递归中。为什么在编译和链接 LIBCMT.lib 时不会发生这种情况,正如我从Microsoft文档中可以看出的那样,/MT 和/MD 之间的区别。
您在new
替换函数中使用std::cout
运算符<<
。此运算符可以轻松地调用new
本身来执行一些分配,进而调用您的new
替换,这将调用<<
,依此类推。
您应该小心您在这些函数中执行的操作。如果你想看看它们是如何被调用的,你可以使用一些预分配的结构并使用它们进行记录(或者简单地增加一个全局计数器(。
它发生在一组标志而不是另一组标志上的原因可能是由于<<
基于这些标志采用的不同分配策略。这些对于实现来说是私有的,你不应该依赖它们。
相关文章:
- MSVC多行宏编译器错误
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- MSVC是否支持C++11样式的属性而不是__declspec
- MSVC将仅移动结构参数解释为指针
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 有与__builtin__FUNCTION()等效的MSVC吗
- 为什么 gcc 编译这个而 msvc 没有
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中为每个目标设置编译器/链接器标志
- MSVC 忽略 [[maybe_unused]] 的功能?
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- MSVC中的宏观扩展问题
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- gcc '-rdynamic' 标志等效于 MSVC
- 为什么重载运算符不与 std::string 一起使用 msvc /MD 标志
- std::function, Clang 6.0 & MSVC (10.0017134.12) - 可能的 ABI 错误或必需的编译器标志
- MSVC++警告标志
- 什么是-D编译器标志C++(clang,GNU,MSVC)