Ein Kopierkonstruktor wird für viele Dinge verwendet, z. B. wenn ich Zeiger verwenden oder dynamisch Speicher für ein Objekt zuweisen muss. Aber ein Blick auf dieses Beispiel bei tutorialpoint.com
:Beispiel eines Kopierkonstruktors erläutern
#include <iostream>
using namespace std;
class Line
{
public:
int getLength(void);
Line(int len); // simple constructor
Line(const Line &obj); // copy constructor
~Line(); // destructor
private:
int *ptr;
};
// Member functions definitions including constructor
Line::Line(int len)
{
cout << "Normal constructor allocating ptr" << endl;
// allocate memory for the pointer;
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "Copy constructor allocating ptr." << endl;
ptr = new int;
*ptr = *obj.ptr; // copy the value
}
Line::~Line(void)
{
cout << "Freeing memory!" << endl;
delete ptr;
}
int Line::getLength(void)
{
return *ptr;
}
void display(Line obj)
{
cout << "Length of line : " << obj.getLength() <<endl;
}
// Main function for the program
int main()
{
Line line(10);
display(line);
return 0;
}
das Ergebnis:
Normal constructor allocating ptr
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Freeing memory!
und wenn ich auf Kommentar (den Kopierkonstruktor) und den Code innerhalb destructor habe ich die gleichen Ergebnisse:
Normal constructor allocating ptr
Length of line : 10
Was ist der Unterschied zwischen der Verwendung des Kopierkonstruktors hier oder nicht? Auch warum "Free Memory!" zweimal vorkommen?
Schauen Sie sich die Ergebnisse an. Im ersten Beispiel ordnen Sie zwei verschiedene Ints zu und geben beide frei. In der zweiten vergeben Sie eine und geben sie zweimal frei. Nicht gut. – chris
es ist nicht im zweiten Beispiel freigegeben, ich habe nur vergessen, den "cout <<" Kommentar Speicher freizugeben!"Anweisung innerhalb des Konstruktors, also ist es tatsächlich nicht freigegeben – Omar
Dann haben Sie etwas zugewiesen, das Sie nicht befreit haben, das ein Speicherverlust ist, wenn es anfängt, komplexer zu werden als nur das Erstellen und Beenden des Programms. – chris