Guten Morgen,
ich habe eine Klasse, die im Konstruktor Speicher dynamisch reserviert
und diesen im Destruktor wieder freigibt. Von der Klasse werden ein paar
Operatoren überladen, unter anderem der = Operator.
1 | class cTest
|
2 | {
|
3 | public:
|
4 | float *elements;
|
5 |
|
6 | cTest()
|
7 | {
|
8 | elements = 0;
|
9 | std::cout << "Konstruktor ohne Parameter aufgerufen" << std::endl;
|
10 | }
|
11 |
|
12 | cTest(int m)
|
13 | {
|
14 | elements = new float[m];
|
15 | std::cout << "Speicher an Adresse " << elements << " reserviert" << std::endl;
|
16 | }
|
17 |
|
18 | ~cTest()
|
19 | {
|
20 | std::cout << "Speicher an Adresse " << elements << " freigegeben" << std::endl;
|
21 | delete [] elements;
|
22 | }
|
23 |
|
24 | cTest operator=(const cTest &test)
|
25 | {
|
26 | elements[0] = test.elements[0];
|
27 | std::cout << "Operator = (von " << test.elements << " nach " << elements << std::endl;
|
28 | return *this;
|
29 | }
|
30 |
|
31 | cTest operator+(const cTest &summand)
|
32 | {
|
33 | cTest *sum = new cTest(1);
|
34 | sum->elements[0] = elements[0] + summand.elements[0];
|
35 | std::cout << "Addition" << std::endl;
|
36 |
|
37 | return *sum;
|
38 | }
|
39 | };
|
Nun möchte ich diese Klasse mit folgendem Code testen:
1 | int main(void)
|
2 | {
|
3 | cTest test(1);
|
4 | cTest test2(1);
|
5 | test = test2 + test;
|
6 | return 0;
|
7 | }
|
Leider scheint etwas mit dem = Operator nicht zu stimmen. Wenn ich wie
in diesem Beispiel
ausführe, dann wird nach dem Aufruf des = Operators der Destruktor "der
linken Seite", in diesem Fall "test" ausgeführt.
Spätestens beim return 0 stürzt das Programm ab, weil der Speicher für
"test" ein zweites mal freigegeben wird.
Gleiches passiert ohne der Addition (z.B.
).
Ich würde gerne wissen, warum der Destruktor nach der Zuweisung
aufgerufen wird. Hat jemand einen Tipp, wie ich das verhindern kann?
Vielen Dank!