Was ist der Unterschied zwischen der Instantiierung eines Objekts mit new vs. without?

In C ++,

Gibt es neben der dynamischen Speicherzuordnung einen funktionalen Unterschied zwischen den folgenden zwei Codezeilen:

Time t (12, 0, 0); //t is a Time object Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object 

Ich nehme natürlich an, dass ein Time (int, int, int) ctor definiert wurde. Ich merke auch, dass im zweiten Fall t gelöscht werden muss, da es auf dem Heap zugewiesen wurde. Gibt es einen anderen Unterschied?

    Die Linie:

     Time t (12, 0, 0); 

    … weist eine Variable vom Typ Time im lokalen Bereich zu, im Allgemeinen auf dem Stack, der beim Beenden des Bereichs zerstört wird.

    Im Gegensatz:

     Time* t = new Time(12, 0, 0); 

    … weist einen Speicherblock zu, indem entweder ::operator new() oder Time::operator new() wird und anschließend Time::Time() mit this Menge auf eine Adresse innerhalb dieses Speicherblocks aufgerufen wird (und auch als zurückgegeben wird) das Ergebnis von new ), das dann in t gespeichert wird. Wie Sie wissen, wird dies normalerweise auf dem Heap (standardmäßig) durchgeführt und erfordert, dass Sie es später im Programm delete , während der pointers in t im Allgemeinen auf dem Stack gespeichert wird.

    Ein weiterer offensichtlicher Unterschied besteht beim Zugriff auf die Variablen und Methoden von t.

     Time t (12, 0, 0); t.GetTime(); Time* t = new Time(12, 0, 0); t->GetTime(); 

    Soweit der Konstruktor betroffen ist, sind die beiden Formen funktional identisch: Sie bewirken nur, dass der Konstruktor für eine neu zugewiesene Objektinstanz aufgerufen wird. Sie scheinen die Unterschiede in Bezug auf Zuweisungsmodi und Objektlebensdauern bereits gut zu verstehen.

    Ich denke du verstehst schon alle Unterschiede. Angenommen, Sie sind sich über den Syntaxunterschied des Zugriffs auf einen Member von t durch einen pointers und durch eine Variable bewusst (na ja, pointers ist auch eine Variable, aber ich nehme an, Sie verstehen, was ich meine). Und unter der Annahme, dass Sie den Unterschied von Aufruf nach Wert kennen und per Referenz aufrufen, wenn Sie t an eine function übergeben. Und ich denke, Sie verstehen auch, was passieren wird, wenn Sie t einer anderen Variablen zuweisen und Änderungen über diese andere Variable vornehmen. Das Ergebnis hängt davon ab, ob t ein pointers ist oder nicht.

    Es gibt keinen funktionalen Unterschied zwischen dem Zuweisen des Objekts auf dem Stapel und dem Zuordnen auf dem Heap. Beide rufen den Konstruktor des Objekts auf.

    Übrigens empfehle ich Ihnen, boost’s shared_ptr oder scoped_ptr zu verwenden, was auch funktionell äquivalent ist, wenn Sie auf dem Heap allokieren (mit dem zusätzlichen Nutzen von scoped_ptr, das Sie davon abhält, nicht kopierbare pointers zu kopieren):

     scoped_ptr 

    Nein .. Es gibt keinen anderen Unterschied ..

    Es gibt keinen anderen Unterschied zu dem, was Sie bereits wissen.

    Angenommen, Ihr Code verwendet den Dienst des Standardoperators neu.

    • Verwenden Sie new: Rufen Sie die neue function des Operators auf, um einen dynamischen Speicher zu erhalten, und rufen Sie dann die constuctor-function auf.
    • Nicht neu verwenden: Ruft den Operator keine neue function auf, sondern ruft direkt die function constuctor auf. Der Stapel wird direkt verwendet, also nicht für malloc.
     void foo (Time t) { t = Time(12, 0, 0); } void bar (Time* t) { t = new Time(12, 0, 0); } int main(int argc, char *argv[]) { Time t; foo(t);//t is not (12,0,0),its value depends on your defined type Time's default constructor. bar(&t);//t is (12,0,0) return 0; }