2

我对放置新操作符有疑问。我有两个程序:Program1 (operator.cpp) 和 Program2 (main.cpp):

程序1: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”时,它正在打印:“From normal new”。预期的输出是:

从正常新 从安置新

但是,如果放置 new 和 main 本身放在同一个文件中,则输出如预期:

从正常新,从安置新。

4

1 回答 1

4

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

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

您没有声明自己的功能。

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

顺便说一句,请注意 C++98 §18.4.1.3/1 禁止替换上面显示的函数(加上其他三个函数,即单个对象和数组形式newdelete带有void*放置参数)。

此外,虽然我在“顺便说一句”评论,但很可能无论放置新的位置被认为是解决方案,都可能有一个更安全、同样有效和更清晰的更高级别的解决方案。

干杯&hth.,

于 2011-01-14T06:25:34.077 回答