关于在C ++中放置新内容

时间:2011-01-14 06:05:49

标签: c++ new-operator placement

我遇到了贴装新操作员的问题。我有两个程序: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放在同一个文件中,则输出符合预期:从普通新文件,从展示位置新

有人可以帮我解决这个问题吗? 这些东西与我的官方工作有关,非常紧急。

1 个答案:

答案 0 :(得分:4)

在你的[main.cpp]中,你包括<new>,它声明了函数

 void* operator new( size_t size, void* p) throw()

您没有声明自己的功能。

因此new声明的函数是唯一已知的函数和被调用的函数。

顺便提一下,请注意C ++98§18.4.1.3/ 1禁止替换上面显示的函数(加上另外三个,即newdelete的单个对象和数组形式void*展示位置参数)。

此外,虽然我正在“顺便”评论,但很可能无论新版本被认为是解决方案,都可能有更安全,更有效,更清晰的更高级解决方案。

干杯&amp;第h。,