【发布时间】:2012-01-05 15:11:51
【问题描述】:
我在VS2005中运行如下代码:
#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
在 Debug 编译中进程返回 1,在 Release 配置中进程返回 0,这意味着 new 运算符未被调用!我可以通过设置断点、写入输出/调试输出等来验证这一点......
为什么会这样,这是符合标准的行为吗?
【问题讨论】:
-
您是否尝试过调试和单步调试代码而不是依赖输出?
-
@Kolky:是的。例如,我在
operator new中设置了一个全局标志,并从 main a -- 解决方案返回它,根本没有输出。 -
有一个interesting bug in GCC <= 4.6.2 在某些编译器设置下,
string的分配器将不使用替换的分配函数。因此,这并非完全闻所未闻。为了好玩,请尝试不同的数据结构,例如vector。 -
@KerrekSB:很有趣。是的,我知道它适用于矢量。这确实是一个错误。看我的回答。
标签: c++ visual-studio-2005 operator-overloading new-operator