Herakles
Profifragensteller
Moin!
Nach Jahren der C-Programmierung muss ich mich derzeit mit einem C++-Projekt herumschlagen. Bisher habe ich es zur guten Praxis gemacht, dass ich alle Variablen initialisiere, damit keine ungewünschten Effekte auftreten. Bei Standardtypen ist das einfach:
Bei zusammengesetzten structs mach ich das wie folgt:
Vergleichbares mache ich auch, wenn ich einen Pointer habe:
Nun bekomme ich in C++ damit Probleme. Zum Einen ist es dort ja so, dass Speicher mittels
alloziert wird. Angeblich wird damit nun der Speicherbereich sowohl alloziert als auch auf "0" gesetzt (wobei ich mich gerade Frage, woher ich diese Info eigentlich habe).
Was aber, wenn ich keinen Pointer habe, sondern bspw. eine lokale Variable, die ich nicht als Pointer deklariere:
Ist dieses struct in c++ dann sofort auch sauber mit "0" initialisiert? Wenn nicht, darf ich hier ein memset(3) aufrufen? Ich habe mit memset(3) schon komische Effekte unter C++ erlebt, wo das Programm einfach stehen blieb o.Ä. Das Verhalten scheint also anders zu sein, als unter C. In einem anderen Forum
http://www.forum-3dcenter.org/vbulletin/archive/index.php/t-504728.html
habe ich gelesen, dass mit memset(3) der "vTable-Pointer mit 0 überschrieben" wird (posting von Nighthawk13). Was auch immer das ist.
Von der Initialisierung mal ganz abgesehen kann es ja durchaus auch mal vorkommen, dass man ein zuvor genutztes struct auch gern wieder zurücksetzen möchte auf "0". Auch für diesen Fall wüsste ich keine Lösung, FALLS man memset(3) nicht gefahrenfrei nutzen könnte...
Weil mir die Internetrecherche nicht hergibt, was ich will (eine klare Beantwortung meiner Frage), möchte ich mich gern an Euch Experten wenden. Könnte Ihr mir auf die Sprünge helfen?
Fragende Grüße
Herakles
Nach Jahren der C-Programmierung muss ich mich derzeit mit einem C++-Projekt herumschlagen. Bisher habe ich es zur guten Praxis gemacht, dass ich alle Variablen initialisiere, damit keine ungewünschten Effekte auftreten. Bei Standardtypen ist das einfach:
Code:
uint16_t wurst = 0;
Bei zusammengesetzten structs mach ich das wie folgt:
Code:
struct mahlzeit {
uint16_t wurst;
uint8_t brot;
};
int main(void) {
struct mahlzeit essen;
memset( &essen, 0, sizeof(struct mahlzeit) );
(...)
}
Vergleichbares mache ich auch, wenn ich einen Pointer habe:
Code:
int main(void) {
struct mahlzeit *Pessen;
Pessen = malloc(sizeof(struct mahlzeit));
memset( Pessen, 0, sizeof(struct mahlzeit) );
(...)
}
Nun bekomme ich in C++ damit Probleme. Zum Einen ist es dort ja so, dass Speicher mittels
Code:
struct mahlzeit *Pessen = new struct mahlzeit;
alloziert wird. Angeblich wird damit nun der Speicherbereich sowohl alloziert als auch auf "0" gesetzt (wobei ich mich gerade Frage, woher ich diese Info eigentlich habe).
Was aber, wenn ich keinen Pointer habe, sondern bspw. eine lokale Variable, die ich nicht als Pointer deklariere:
Code:
struct mahlzeit essen;
Ist dieses struct in c++ dann sofort auch sauber mit "0" initialisiert? Wenn nicht, darf ich hier ein memset(3) aufrufen? Ich habe mit memset(3) schon komische Effekte unter C++ erlebt, wo das Programm einfach stehen blieb o.Ä. Das Verhalten scheint also anders zu sein, als unter C. In einem anderen Forum
http://www.forum-3dcenter.org/vbulletin/archive/index.php/t-504728.html
habe ich gelesen, dass mit memset(3) der "vTable-Pointer mit 0 überschrieben" wird (posting von Nighthawk13). Was auch immer das ist.
Von der Initialisierung mal ganz abgesehen kann es ja durchaus auch mal vorkommen, dass man ein zuvor genutztes struct auch gern wieder zurücksetzen möchte auf "0". Auch für diesen Fall wüsste ich keine Lösung, FALLS man memset(3) nicht gefahrenfrei nutzen könnte...
Weil mir die Internetrecherche nicht hergibt, was ich will (eine klare Beantwortung meiner Frage), möchte ich mich gern an Euch Experten wenden. Könnte Ihr mir auf die Sprünge helfen?
Fragende Grüße
Herakles

C++ ist eben nicht "C mit Klassen", die beiden Sprachen haben prinzipiell unterschiedliche Spezifikationen und Verhalten. Was in C geht, geht in C++ oft nicht oder tut etwas komplett anderes. Versuche also bitte nicht Probleme mit C++ in C zu lösen, das fliegt dir um die Ohren.