2011-01-14 16 views
1

Ich habe ein Problem mit der Platzierung neuer Operator. Ich habe zwei Programme: Program1 (operator.cpp) und Program2 (main.cpp): Program1: operator.cppBezüglich Platzierung neu in C++

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; 
} 

Hier ist das zweite Programm, zu dem die ersten verbunden: main.cpp:

 #include <new> 
     int main() 
     { 
     int *ptr=new int; 
     int *ptr1=new(ptr) int(10); 
     } 

ich individuell operator.cpp und main.cpp bin Kompilieren wie gezeigt:

operator.cpp: g++ -g -c -o operator operator.cpp 

verbindet sie dann mit main.cpp:

g++ -g -o target operator main.cpp. 

Überraschenderweise, wenn ich "./target" ausführe es druckt: "Von normal neu". Die erwartete Ausgabe ist: Von normal neu Von Platzierung neu.

Wenn jedoch die Platzierung neue und die wichtigsten in der gleichen Datei gesetzt werden selbst dann wird die Ausgabe wie erwartet: Von normalen neuen, von Platzierung neuer

Kann mir jemand bitte helfen in Bezug auf das? Dieses Zeug steht mit meiner offiziellen Arbeit in Verbindung und ist sehr, sehr dringend.

Antwort

4

In Ihrem [main.cpp] Sie einschließlich <new>, die die Funktion

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

Sie nicht erklären, um Ihre eigene Funktion erklärt.

Daher ist die von new deklarierte Funktion die einzige, die bekannt ist, und die, die aufgerufen wird.

Im übrigen ist zu beachten, dass oben gezeigten 98 C++ §18.4.1.3/1 Ersatz der Funktion verbietet (plus drei andere, nämlich einzelner Objekt und Array-Formen von new und mit deletevoid* Platzierungs Argumente).

Auch während ich auf der "nebenbei" kommentieren, Chancen sind, dass, was auch immer die neue Platzierung gedacht ist, die Lösung ist, gibt es wahrscheinlich eine sicherere und genauso effiziente und klare Lösung auf höherer Ebene.

Beifall & hth.,

+0

Es tut mir leid, aber ich mit Ihnen nicht einverstanden sind. Es verbietet, die tatsächliche Platzierung neu zu überladen: void * operator new (size_t size, void * p). Aber wir können void * in int * überladen und es überladen. Ich habe es in einer einzigen Datei versucht und es hat funktioniert. Es zeigt "Von Platzierung neu". Warum dann beim Verknüpfen, das Gleiche mit einer anderen Datei, ist es nicht? – kingsmasher1

+0

@ kingsmasher1 Re "ich stimme nicht zu", vielleicht interpretierst du "die oben gezeigte Funktion falsch". Stellen Sie am Ende eine Frage, da Ihre Funktion in [main.cpp] nicht deklariert ist. Sag es einfach. Cheers & hth., –

+0

@ kingsmart: weil, wenn Sie sie in separaten Dateien haben, Sie nicht überladen, da es keine überladene Deklaration in main.cpp –