Le code suivant me donne une erreur de segmentation lorsqu'il est exécuté sur une machine 2 Go, mais fonctionne sur une machine 4 Go.
int main()
{
int c[1000000];
cout << "done\n";
return 0;
}
La taille du tableau n'est que de 4 Mo. Y a-t-il une limite sur la taille d'un tableau qui peut être utilisé en C ++?
c++
arrays
segmentation-fault
Mayank
la source
la source
En C ou C ++, les objets locaux sont généralement alloués sur la pile. Vous allouez un grand tableau sur la pile, plus que ce que la pile peut gérer, vous obtenez donc un stackoverflow.
Ne l'allouez pas localement sur la pile, utilisez plutôt un autre endroit. Cela peut être réalisé en rendant l'objet global ou en l'allouant sur le tas global . Les variables globales sont très bien, si vous n'utilisez le depuis aucune autre unité de compilation. Pour vous assurer que cela ne se produit pas par accident, ajoutez un spécificateur de stockage statique, sinon utilisez simplement le tas.
Cela allouera dans le segment BSS, qui fait partie du tas:
Cela allouera dans le segment DATA, qui fait également partie du tas:
Cela allouera à un emplacement non spécifié dans le tas:
la source
delete
partout où vous alloueznew
. Mais si vous êtes sûr d'allouer de la mémoire une seule fois (comme dans main), ce n'est strictement pas nécessaire - la mémoire est garantie d'être libérée à la sortie de main même sans explicitedelete
.De plus, si vous utilisez la plupart des systèmes UNIX et Linux, vous pouvez augmenter temporairement la taille de la pile à l'aide de la commande suivante:
Mais attention, la mémoire est une ressource limitée et avec une grande puissance viennent de grandes responsabilités :)
la source
Votre tableau est alloué sur la pile dans ce cas, essayez d'allouer un tableau de la même taille en utilisant alloc.
la source
Parce que vous stockez le tableau dans la pile. Vous devez le stocker dans le tas. Consultez ce lien pour comprendre le concept du tas et de la pile.
la source