Rein prinzipiell kann man natürlich auch einfach von vornherein einen größeren Stack für sein Programm anfordern. Aber ich vermute mal, dass std::vector die bessere Lösung sein wird. Ohne zu wissen, worum es sich konkret handelt, kann man am Ende aber natürlich nur spekulieren...
Zusammenhängender Adressbereich ist eigentlich kein Problem dank virtueller Speicherverwaltung. Adressen sind ohnehin alle virtuell und Speicher zusammengestückelt. Darum kümmert sich Windows dann schon.
Virtuelle Speicherverwaltung sorgt nur dafür, dass der Speicher nicht zusammenhängend sein muss. Der Adressbereich muss weiterhin zusammenhängend sein. Und auch der virtuelle Adressraum ist mit reservierten Bereichen durchzogen und von Fragmentierung betroffen. Die Chance 1000 mal 1 MB zu bekommen ist da generell größer als 1 mal 1000 MB.
Du spielst wohl auf externe Fragmentierung an? Damit hatte ich persönlich erst ein einziges Mal wirklich Probleme und das war in einer 32 Bit .NET Anwendung, die mit Arrays in der Größenordnung von hunderten MB hantiert hat und das war damals wohl mindestens zur Hälfte der Garbage Collection zu verdanken...