我遇到了贴装新操作员的问题。我有两个程序:Program1(operator.cpp)和Program2(main.cpp): Program1:operator.cpp
void *operator new(size_t size)
{
void *p;
cout << "From normal new" << endl;
p=malloc(size);
return p;
}
void *operator new(size_t size, int *p) throw()
{
cout << "From placement new" << endl;
return p;
}
这是第一个链接到的第二个程序: main.cpp中:
#include <new>
int main()
{
int *ptr=new int;
int *ptr1=new(ptr) int(10);
}
我正在单独编译operator.cpp和main.cpp,如下所示:
operator.cpp: g++ -g -c -o operator operator.cpp
然后将其与main.cpp链接:
g++ -g -o target operator main.cpp.
令人惊讶的是,当我执行“./target”时,它正在打印:“来自正常的新”。 预期的输出是:从正常的新 从新位置开始。
但是,如果将展示位置new和main放在同一个文件中,则输出符合预期:从普通新文件,从展示位置新
有人可以帮我解决这个问题吗? 这些东西与我的官方工作有关,非常紧急。
答案 0 :(得分:4)
在你的[main.cpp]中,你包括<new>
,它声明了函数
void* operator new( size_t size, void* p) throw()
您没有声明自己的功能。
因此new
声明的函数是唯一已知的函数和被调用的函数。
顺便提一下,请注意C ++98§18.4.1.3/ 1禁止替换上面显示的函数(加上另外三个,即new
和delete
的单个对象和数组形式void*
展示位置参数)。
此外,虽然我正在“顺便”评论,但很可能无论新版本被认为是解决方案,都可能有更安全,更有效,更清晰的更高级解决方案。
干杯&amp;第h。,