По поводу размещения нового в C ++ - PullRequest
1 голос
/ 14 января 2011

У меня проблема с размещением нового оператора. У меня есть две программы: 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», он печатает: «Из нормального нового». Ожидаемый результат: от нормального нового С размещения нового.

Однако, если новое и основное размещение помещены в один и тот же файл, вывод будет таким, как ожидалось: Из нормального нового, Из нового размещения

Может кто-нибудь помочь мне с этим? Этот материал связан с моей официальной работой и очень срочен.

1 Ответ

4 голосов
/ 14 января 2011

В вашем [main.cpp] вы включаете <new>, который объявляет функцию

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

Вы не объявляете свою собственную функцию.

Следовательно, функция, объявленная new, является единственной известной и вызываемой.

Кстати, обратите внимание, что C ++ 98 §18.4.1.3 / 1 запрещает замену функции, показанной выше (плюс три другие, а именно формы одного объекта и массива new и delete с размещением void* аргумент).

Кроме того, хотя я и комментирую «кстати», есть вероятность, что, каким бы ни было размещение новых решений, вероятно, существует более безопасное и столь же эффективное и более четкое решение более высокого уровня.

Приветствия & hth.,

...