cpp array größe mit new will nicht(?)

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/cpp-array-gre-mit-new-will-nicht_236868/page_1 - zur Vollversion wechseln!


pinkey schrieb am 23.11.2013 um 20:28

Steh grad irgendwie an, will ein Array dynamisch initialisieren, machs eigentlich genau so wie in allen Tutorials und wie ichs eigentlich "gelernt" hab ... nur es will nicht.

z.B:

Code: CPP
int* a = NULL;
a = new int[10];
for(int i=0;i<9;i++) {
    a[i] = i;
}

Es will mir einfach kein Array anlegen, ich kann immer nur maximal den derzeitigen Wert schreiben.

Was kanns da haben ^^?


Neo1010 schrieb am 23.11.2013 um 20:38

sollt meiner meinung nach so passen - mal grob drüber geschaut
was mir nur auffällt wenn du 10 elemente willst solltest in der schleife <10 statt <9 schreiben ;)


pinkey schrieb am 23.11.2013 um 20:40

Zitat von Neo1010
sollt meiner meinung nach so passen - mal grob drüber geschaut
was mir nur auffällt wenn du 10 elemente willst solltest in der schleife <10 statt <9 schreiben ;)

klar :) das war jetzt einfach nur kurz zum testen ...

wenn ichs mit a[10] anleg gehts ... aber mit new wills einfach nicht funktionieren. compiler is der vom vs2012

edit: omfg, fixed ... das war kein fehler sondern nur eine falsche anzeige im debugger. zum debuggen von solchen dynamisch initialisierten sachen muss mans cheinbar im debugger var,anzahlwerte schreiben, dann hauts hin :)


FMFlash schrieb am 28.11.2013 um 10:31

Wenn du mal genauer wissen möchtest was im Speicher steht empfehle ich dir die "Memory" Ansicht zu verwenden. Findest du im Menü Debug -> Windows -> Memory.

Ausserdem, da du C++ verwendest, und nicht C, könntest du dieses hässliche Array im obrigen Beispiel besser mit einem vector ausdrücken:

Code: CPP
    std::vector<int> a(10);
    for (int i = 0; i < (int)a.size(); i++) {
      a[i] = i;
    }

Erspart dir viele potentielle Kopfschmerzen und der Debugger spielt auch mit.


pinkey schrieb am 28.11.2013 um 10:44

Danke für den Tipp!

Sind vectoren jetzt die neuen Arrays, also komplett Arrays durch vectoren ersetzen oder ...?


FMFlash schrieb am 28.11.2013 um 11:24

std::vector implementiert ein dynamisches array (mit 24 Byte overhead, falls du es genau wissen willst), bei dem du dich nicht selbst um die Speicherverwaltung und Pointer kümmern musst.

Falls es kein dynamisches array sein muss kannst du statt vector auch einfach schreiben:

Code: CPP
std::array<int, 10> a;
Das ist dann exakt was du zuvor auch hattest, nur wieder ohne Pointer und ohne overhead (kein extra Speicherbedarf).
Der Vorteil gegenüber einem int a[10] ist dabei dass das std::array seine größe kennt (a.size() == 10) ohne mit sizeof(a)/sizeof(int) oder dubiosen Macros rumrechnen zu müssen. Potentielle Fehlerquellen grundsätzlich vermeiden ist das Stichwort.


Nico schrieb am 29.11.2013 um 05:01

du hast es zwar schon gelöst, also nur btw: array-inhalt einfach mit std::cout ausgeben lassen um array-init zu testen.


pinkey schrieb am 05.12.2013 um 13:36

Danke nochmal für die Infos u. Tipps.
Hätte gleich noch eine Frage dazu passend. Eine API die ich verwend erfordert das manche Vars 128 Bit aligned sind. Ansich kein Problem mit __attribute__ ((aligned (16)) (das mitgelieferte macro geht will irgendwie nicht, deswegen so ^^) nur wie mach ich das in kombination mit new?

wenn ichs über array initialisiere, also hausnummer int bla[100] __attri ... gehts, mach ichs mit new is scheinbar nicht mehr 128bit aligned und die API schreit dann natürlich das ihr das nicht passt.


FMFlash schrieb am 05.12.2013 um 16:11

Zitat von pinkey
Eine API die ich verwend erfordert das manche Vars 128 Bit aligned sind.

Meinst du struct member alignment?


that schrieb am 06.12.2013 um 22:18

Zitat von pinkey
Danke nochmal für die Infos u. Tipps.
Hätte gleich noch eine Frage dazu passend. Eine API die ich verwend erfordert das manche Vars 128 Bit aligned sind. Ansich kein Problem mit __attribute__ ((aligned (16)) (das mitgelieferte macro geht will irgendwie nicht, deswegen so ^^) nur wie mach ich das in kombination mit new?

wenn ichs über array initialisiere, also hausnummer int bla[100] __attri ... gehts, mach ichs mit new is scheinbar nicht mehr 128bit aligned und die API schreit dann natürlich das ihr das nicht passt.

Interessantes Problem. :)

Ich fürchte, das geht nur mit Workarounds, z.B. ein Byte-Array 15 Bytes größer allozieren und dann die richtige Anfangsadresse suchen. Oder den Speicher mit mmap bzw. VirtualAlloc direkt vom OS anfordern, da bekommt man üblicherweise ganze 4K-Pages.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026