• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Speicherzugriffsfehler

hwiedema

Newbie
Hallo,

ich habe ein Problem, das ich bei älteren g++-Varianten nicht hatte: bei Programmen mit großem Speicherbedarf kommt
noch bevor das Programm startet die berüchtigte Fehlermeldung "Speicherzugriffsfehler". Um das Problem zu isolieren, habe
ich mal ein ganz kleines c++-Programm geschrieben:

#include <iostream>

using namespace std;

const int nmax = 2000;


int main( int argc, char *argv[] )

{
double x[nmax][nmax];
int n1, n2;

cout << "Hier bin ich!\n";

for (n1=0; n1<nmax; n1++)
for (n2=0; n2<nmax; n2++)
x[n1][n2] = n1 - n2;

for (n1=0; n1<nmax; n1++)
for (n2=0; n2<nmax; n2++)
cout << x[n1][n2] << "\n";

return(0);

Muss ich irgendwelche Compiler-Switches setzen, damit dieses Programm ausgeführt wird? Schon der erste cout-Befehl
wird bei mir nicht ausgeführt!

Die include-Zeile hatte ich vorhin vergessen... Sorry.

Vielen Dank im Voraus,

Harald
 

Tooltime

Advanced Hacker
Zuerst solltest du hier im Forum für Quellcode auch die Quellcode-Tags benutzen, dann geht die Formatierung nicht verloren.

Was mir beim Überfliegen auffällt:

  • Die abschließende geschweifte Klammer für main fehlt.

    Das Array würde ich dynamisch erzeugen, dann kann ich testen ob überhaupt genug Speicher vorhanden ist, auch wenn wie hier dargestellt nur 32MB notwendig sind.

    In C++ erzeugt man den Zeienvorschub nicht mit \n sondern cout << endl.

    In C++ sollte man C-Arrays meiden und stattdessen vector benutzen, dann kann man jederzeit die Arraygröße über vector abfragen, bzw. die Zeiger auf Anfang und Ende des Datenfeld abfragen.

    Die Adressierung über Indexvariable und Array-Schreibweise ist langsam, besser gleich Zeigerarithmetik.
 
OP
H

hwiedema

Newbie
Danke Tooltime,

das hat mein Problem gelöst (auch wenn im Dunkeln bleibt, warum es mit Arrays nicht funktioniert).

Viele Grüße

Harald
 

Tooltime

Advanced Hacker
Naja, eine Theorie hätte ich schon. Normaler Weise sollte das Array wie du es verwendet hast auf dem Stack erzeugt werden. Ist das Datenobjekt größer, ich glaube die Grenze liegt bei 64-128kB, wird es dynamisch auf dem heap erzeugt. Da können schon die ersten Probleme auftreten, weil spezielle Attribute eines Datentypes nicht berücksichtigt werden. Bei mir war es mal das 128-Bit Alightment für SSE-Variablen, das verloren ging. Die nächste Stufe kommt bei sehr großen Objekten >diverse MB's, die wenn ich mich recht erinnere nicht mehr auf dem heap des Programms erzeugt werden, sondern der Speicher direkt vom Betriebssystem geholt wird. Und genau da denke ich wird das Problem liegen.

Für mich gilt jedenfalls der Leitsatz, größere Datenobjekte immer selber dynamisch erzeugen.
 
Oben