Kezdőoldal » Számítástechnika » Programozás » Std::array<std::array<double,3...

Std::array<std::array<double,300>,300> stack overflow . Miért?

Figyelt kérdés
Én úgy tudtam ettől jóval nagyobb memóriablokkokat is le lehet foglalni, de ha elindítom a programot stack overflow-t jelez. 200*200-nál még nem akad ki.

2014. febr. 5. 11:29
 1/9 anonim ***** válasza:
0%
300 x 300 = 90.000 ami > mint a double
2014. febr. 5. 11:32
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:
wut? o.O
2014. febr. 5. 11:34
 3/9 iostream ***** válasza:

Tegyük fel, hogy a double mérete 8 byte. Te lefoglalsz 300*300*8 byte-ot, ami nagyobb probléma, hogy mindezt a stacken teszed. Memóriablokkot nagyokat is lehet foglalni, de az std::array nem végez dinamikus allokációt, az pontosan ott van, ahova létrehoztad (ellentétben pl a vectorral, ami csak egy pointert tartalmaz a foglalt memóriaterületére).


Bár 720k-nak nem kéne soknak lennie, de valószínűleg mással is megpakoltad már a stacket.

2014. febr. 5. 12:00
Hasznos számodra ez a válasz?
 4/9 A kérdező kommentje:
Milyen tárolót érdemes használni, ha fontos, hogy állandó méretűt szeretnék?
2014. febr. 5. 12:03
 5/9 iostream ***** válasza:

Több megoldás is van.

1) Miért fontos, hogy állandó méretűt szeretnél? Valószínűleg nem fontos, és egy szimple vector<array<double, 300>> is megoldja a problémát szépen. Javaslom a reserve függvény megtekintését.

2) Ha mindenképp ragaszkodsz ehhez, allokáld dinamikusan:

typedef std::array<std::array<double,300>,300> MyArray;

std::unique_ptr<MyArray> array(new MyArray);

2014. febr. 5. 12:30
Hasznos számodra ez a válasz?
 6/9 A kérdező kommentje:

Ó ezer köszi a válaszokat!


Annyira nem létfontosságú a stabil méret. A kóddal akartam spórolni és a saját vektor meg mátrix osztályaimat származtattam le az std::array-ból. Először vector-ból származtattam, de elég rondán nézett ki, hogy el kellett fedni egy csomó függvényt. Array-al szebb volt, de ott meg assignment-nél kifagyott.

2014. febr. 5. 13:15
 7/9 iostream ***** válasza:
Miért akarsz leszármazni ezekből? STL osztályokból leszármazni nem feltétlenül jó ötlet, legfeljebb protected/private módon, de akkor a sima tartalmazás (felveszed membernek) már jobb. Nem arra tervezték őket, hogy leszármazz, nincs igazán értelmes jelentése.
2014. febr. 5. 14:10
Hasznos számodra ez a válasz?
 8/9 A kérdező kommentje:
Hmmm .... kipróbáltam pár verziót azokból amit mondtál ... rájöttem, kicsit túlbonyolítottam a dolgot. Visszatértem a sima tömbhöz. Ha unique_ptr mögé rakom, akkor a 10000*10000 méretűt is simán beveszi.
2014. febr. 5. 19:11
 9/9 iostream ***** válasza:
Nem a unique_ptr a lényeg, hanem a new. A new a dinamikus memóriában allokál, az automatikus változók meg a stacken jönnek létre.
2014. febr. 5. 19:39
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!