array zu groß?
-
hallo zusammen!
ich programmiere grade ein projekt, und bin dabei auf folgendes problem gestoßen:
beim erstellen eines feldes mit größe mehr als 500x500, stürzt in windows das programm ab und unter linux kommt die meldung: segmentation fault.also in kurzversion das problem:
#include <iostream>
using namespace std;
int main(){
cout << "let's declare a field!" << endl;
double H[600][600];
cout << "field created successfully!" << endl;
system("pause");
}das system("pause") muss man sich in linux wegdenken.
vielleicht läuft es ja bei euch!
ich kann das fehlerfrei compilen, aber in der runtime gibts eben den fehler.
also zu groß für den speicher kann doch so ein feld auf keinen fall sein oder? hat jemand eine idee wie das beheben kann?vielen dank schonmal für rückmeldungen!
-
500*500*double=2 Megabyte, das ist zu viel für den Stack.
Mit new klappt das aber.
Hat aber ne komische Syntax. AFAIR stehen Beispiele in den FAQ.
-
Mit doubles ist das im Zweifel sogar noch mehr.
Arrays dieser Größe packt man, wie volkard schon erwähnte, auf den Heap, um genau diese Problematik zu umgehen. Ein flaches new[] hat aber den Nachteil, dass man von Hand wieder aufräumen muss, was im Zusammenhang mit Exceptionsicherheit etwas unschön ist. Du solltest dir mindestens einen RAII-Container oder einen Aufräumer auf den Stack legen, etwa
template<typename pointer_t> class array_cleaner { public: array_cleaner(pointer_t ptr) : ptr_(ptr) { } ~array_cleaner() { delete[] ptr_; } private: pointer_t ptr_; }; int main() { double (*array)[600]; array_cleaner<double(*)[600]> cleaner(array = new double[600][600]); }Allerdings ist das eine etwas hingerotzte Lösung. Schau dir mal Boost.Multi-Array an, das ist für so was prädestiniert.
-
ok ich glaube das wird mein problem lösen. vielen dank!