Segmentation fault beim Versuch ein array aufn hip anzulegen
-
HighLigerBiMBam schrieb:
Vielleicht bin ich auch nur schizophren, whatever.

Ich würde eher sagen, dass du im Eifer des Gefechts etwas verhaspelst hast, es nun nicht zugeben möchtest und dich in die Enge getrieben fühlst

@XSpille,
Es gilt aber weiterhin, dass man versuchen sollte, wenn möglich und "sinnvoll" auf Zeiger zu verzichten.
Vicious Falcon schrieb:
Hintergrund: Nicht jeder entwickelt reine C++ Programme ein Leben lang mit der Konsole. Irgendwann ist der Punkt gekommen, sich mit den (C-) Funktionen des Betriebssystems auseinanderzusetzen. RAII ist hier sehr nett, aber um seine eigenen RAII-Klassen zu schreiben, muss man? Genau, nochmal das Posting lesen :).
Oder am besten
std::vectorverwenden. Es gibt bereits viele fertig RAII Klassen in der Standardbibliothek und zukünftig noch mehr. Boost bietet auch eine Vielzahl an. Ich habe ehrlich gesagt schon länger nicht mehr mit Zeiger hantieren müssen, nur weil ich eine C Schnittstelle angesprochen habe. Höchstens habe ich vielleicht noch den Address-Of-Operator eingesetzt.int bufferSize = GetWndowTextLength(window_handle)); std::vector<char> buffer(bufferSize); GetWindowText(window_handle, &buffer[0], buffer.size());Speicher kann man in C++ auch bei C Schnittstellen völlig über RAII verwalten. Höchstens für andere Ressourcen muss man eigene RAII Klassen einführen. Allerdings spricht man diese Ressourcen kaum über Zeiger an oder nur über versteckte Zeiger, sondern meistens geht dies über Handles. Man braucht auch kein
newoderdelete, usw. usf.Grüssli
-
Dravere schrieb:
viel Richtiges
Ja, statt eines int* verwende ich auch lieber vector<int>.
Schaden tut es aber nicht, die Konzepte dahinter zu verstehen. Und wenn man es gewohnt ist, dass zu einem new immer ein delete gehört, dann weiß man auch, dass zu einem Anfordern eines Handles auch immer eine entsprechende Freigabe gehört.Aber das muss man ja alles nicht mehr können. Wir können ja einfach nur die Daten zwischen Standardbibiothek und boost umherschieben und nennen den Vorgang "programmieren". Grundlagen sind egal.

-
Auch Handles darfst du gerne RAIIen.
-
Ich habe nichts anderes behauptet. Die Freigabe darf aber auch nicht in der RAII-Klasse vergessen werden.
-
Vicious Falcon schrieb:
Ich habe nichts anderes behauptet. Die Freigabe darf aber auch nicht in der RAII-Klasse vergessen werden.
Ich dachte, das wäre quasi per Definition so.
-
Vicious Falcon schrieb:
Grundlagen sind egal.

Man sollte sich fragen, was zu den Grundlagen gehört, bzw. in welcher Reihenfolge man es lernen möchte. RAII und
std::vectorgehören weit an den Anfang. new und delete, wie auch Zeiger, gehören weiter nach hinten. Sobald man zu diesen kommt, kann man nämlich am bereits gelernten aufzeigen, wie man damit am besten arbeitet. Nämlich eben RAII einsetzen und als Beispiel könnte manstd::vectornennen.Du kannst jemanden RAII beibringen, ohne auf Zeiger oder Speicherverwaltung einzugehen. Daher kannst du ihm auch beibringen, dass er die Ressource freigeben muss.
Grüssli
-
Dravere schrieb:
...hantieren müssen, nur weil ich eine C Schnittstelle angesprochen habe. Höchstens habe ich vielleicht noch den Address-Of-Operator eingesetzt.
int bufferSize = GetWndowTextLength(window_handle)); std::vector<char> buffer(bufferSize); GetWindowText(window_handle, &buffer[0], buffer.size());Jetzt sag aber bitte nicht, daß bufferSize compilezeitkonstant war. Das wäre nämlich ein Weg, mit vector Zeit wegzuwerfen. Der ist mir gar nicht eingefallen.
-
Dravere schrieb:
RAII und
std::vectorgehören weit an den Anfang. new und delete, wie auch Zeiger, gehören weiter nach hinten.Da bin ich ganz anderer Meinung.
-
volkard schrieb:
Dravere schrieb:
...hantieren müssen, nur weil ich eine C Schnittstelle angesprochen habe. Höchstens habe ich vielleicht noch den Address-Of-Operator eingesetzt.
int bufferSize = GetWndowTextLength(window_handle)); std::vector<char> buffer(bufferSize); GetWindowText(window_handle, &buffer[0], buffer.size());Jetzt sag aber bitte nicht, daß bufferSize compilezeitkonstant war. Das wäre nämlich ein Weg, mit vector Zeit wegzuwerfen. Der ist mir gar nicht eingefallen.
Und wenn schon.. dann nimm halt das boost array oder tr1 array.
-
volkard schrieb:
Wie kommst du überhaupt auf die Idee?
Sorry, war verpeilt.