Forum: Mikrocontroller und Digitale Elektronik arr = new unsigned int [5];


von Maude (Gast)


Lesenswert?

Hallo mal wieder,

der Betreff spiegelt schon wieder, was ich vorhabe.
Ich habe im H-File einen unsigned int Pointer "arr" á la

>volatile unsigned int arrLenght;
>unsigned int* arr;
(Das volatile soll Optimierung für diesen Test verhindern, da es sonst 
im Zweifel als Konstante kompiliert wird, weil keine dynamische 
Anpassung erfolgt)

und im Konstruktor eine Allokierung á la

>arrLenght = 5;
>arr = new unsigned int [arrLenght];

Ich kanns kompilieren, dennoch habe ich "aus dem Dunst heraus" 
Bauchschmerzen. Ist es legitim? Hängt es eventuell von Randparametern 
wie z.B. Compilereinstellungen ab, ob es legitim ist?

viele Grüße!

von Mark B. (markbrandis)


Lesenswert?

Maude schrieb:
> Ist es legitim?

Ja.

Illegitim wird es, wenn Du das "delete" zu dem "new" vergisst ;-)

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Das alles ist Basis-C++. Warum hast du da Bauchschmerzen?

Oliver

von Dr. Sommer (Gast)


Lesenswert?

Variablen im Header zu definieren ist aber keine gute Idee, denn dann 
hast du 1 Exemplar dieser Variable pro Source-File, die den Header 
inkludiert, und erhälst dann multiple definition errors beim Linken. Es 
sei denn, die Variablen sind Member-Variablen einer Klasse, was du aber 
nicht verrätst...?

von Maude (Gast)


Lesenswert?

Ja stimmt, es sind Membervariablen. Habe ich da jetzt nen ernsthaften 
Lack? Ich ging davon aus, es währe automatisch der Fall, wenn Variablen 
unter Public/Protected/Private definiert sind (was zugegebener Maßen aus 
meinen Schnippseln nicht hervorgeht).

von Karl H. (kbuchegg)


Lesenswert?

Maude schrieb:
> Ja stimmt, es sind Membervariablen. Habe ich da jetzt nen ernsthaften
> Lack?

Das kommt drauf an, wie und wo und warum der new[] überhaupt gemacht 
wird, bzw. wie und wo und warum der delete[] im Code ist.

Aber eines ist sicher: Wenn du kein delete[] zu deinem new[] hast, dann 
hast du ein Speicherleck.

Allerdings kann man auch fragen: warum eigentlich selber allokieren. 
Wenn du schon new verwendest, könntest du das genausogut einer der 
STandard-Klassen überlassen, die sich dann für dich um die 
Speicherverwaltung kümmern. Wie zb ein std::vector oder ein std::array 
oder ....
Denn eigentlich besteht einer der Kunstgriffe in der erfolgreichen C++ 
Programmierung darin, eben nicht sich das Leben dadurch schwer zu 
machen, dass man in einer allgemeineren Klasse Allokierungen durchführt, 
sondern das einer Klasse überlässt, die genau darauf spezialisiert ist.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Dr. Sommer schrieb:
> Variablen im Header zu definieren ist aber keine gute Idee, denn dann
> hast du 1 Exemplar dieser Variable pro Source-File, die den Header
> inkludiert, und erhälst dann multiple definition errors beim Linken. Es
> sei denn, die Variablen sind Member-Variablen einer Klasse

unabhängig von der Klasse

wäre dann nicht im Header

#ifndef VAR_123
   #define VAR_123 1
   volatile unsigned int arrLenght;
   unsigned int* arr;
#endif

möglich?

von Karl H. (kbuchegg)


Lesenswert?

Joachim B. schrieb:

> wäre dann nicht im Header
>
> #ifndef VAR_123
>    #define VAR_123 1
>    volatile unsigned int arrLenght;
>    unsigned int* arr;
> #endif
>
> möglich?

Möglich schon. WÜrde aber nichts ändern.
Du mögest bitte in deinem C Buch über den Unterschied zwischen 
Definition und Deklaration nachlesen, über die One-Definition-Rule und 
welche Rolle dabei das Schlüsselwort 'extern' spielt.
Diese Grundlagen sind in C++ auch nicht anders.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Eine Kurzzusammenfassung findet sich auch hier
FAQ: Globale Variablen über mehrere Dateien

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.