我在VS2005中运行了以下代码:
在调试编译中,该过程返回1,而在发布配置中,该过程返回0,这意味着
#include <iostream>
#include <string>
#include <new>
#include <stdlib.h>
int flag = 0;
void* my_alloc(std::size_t size)
{
flag = 1;
return malloc(size);
}
void* operator new(std::size_t size) { return my_alloc(size); }
void operator delete(void* ptr) { free(ptr); }
void* operator new[](std::size_t size) { return my_alloc(size); }
void operator delete[](void* ptr) { free(ptr); }
int main()
{
std::string str;
std::getline(std::cin, str);
std::cout << str;
return flag;
}
我输入了一个足够长的字符串(长度超过小字符串优化缓冲区):
0123456789012345678901234567890123456789012345678901234567890123456789
在调试编译中,该过程返回1,而在发布配置中,该过程返回0,这意味着
new
操作符没有被调用!我可以通过设置断点、写入输出/调试输出等方式来验证这一点......
为什么会这样,这是符合标准的行为吗?
operator new
中设置了一个全局标志,并从主函数中返回它——这是一个完全没有输出的解决方案。 - Yakov Galka