J'ai un problème de tableau que je veux surmonter, si je modifie la valeur de const int "sont" à 2048, le programme fonctionne bien mais à 8192 ou même à 4096 (seulement 130 000 éléments), il ne fonctionne pas et ne se casse pas. Comment puis-je contourner cela?
5 Réponses :
allouer de manière dynamique de manière dynamique, car il y a souvent des limites sur la quantité de données que vous pouvez avoir sur la pile (où les variables locales automatiques se terminent généralement):
J'avais peur de le faire parce que mon programme est beaucoup plus grand et qui se bloque beaucoup, que se passe-t-il si je n'ai pas supprimé la mémoire et mon programme se bloque avant cela, le processeur désaffecterait-il la mémoire?
@Gambit: Faites de votre programme.
@Gambitking: toute la mémoire allouée par un processus est libérée lorsqu'elle se termine. Ainsi, un crash de programme libère automatiquement votre mémoire.
@Gambitking, si votre programme se bloque, tout sera pris de cela.
Existe-t-il un programme gratuit que je peux utiliser cela qui libère la mémoire après ce genre de crash?
@thiton: C'est spécifique à la mise en œuvre!
@Gambitking: Comme vous l'avez été informé, il n'y a généralement pas besoin d'une telle chose. La mémoire allouée est récupérée lorsque le processus se termine - généralement. C ++ ne définit pas réellement cela, mais les osses modernes.
OH OK, l'utilisation de la variable Suppr [] n'est pas si obligatoire, cela affecte simplement les performances du système pendant que le programme fonctionne après la libération de la mémoire. Merci
Ce n'est pas "obligatoire" du tout ... C'est juste une très bonne idée. Même si vous savez que vous ne faisez que allouer une fois dans votre programme, prenez l'habitude de nettoyer la mémoire, de sorte que vous ne vous retrouvez pas avec des fuites de culture pendant l'exécution. Vous devrait i> utiliser un conteneur standard au lieu de neuf code> ing.
@Gambitking Vous n'allociez réellement pas du tout une mémoire physique sur tout système d'exploitation moderne et général à usage général, vous allouez l'espace d'adresses, la mémoire virtuelle. Lorsqu'un processus se termine, son espace d'adressage cesse d'exister. Il est donc logiquement impossible pour ne pas être libéré.
Vous mettez la structure de données sur la pile dans principal code>, et c'est assez énorme. Vous pouvez augmenter la taille de la pile (dépend de votre système) ou allouer la structure sur le tas avec nouveau code> ou malloc code>. P>.
Vous pouvez commencer par attribuer DataStructure _ * code> pas dans la pile. Par exemple en préparant le mot-clé code> statique code>.
... qui entraînera une énorme exécutable. La bonne solution ici est d'utiliser le tas.
@Matteoitalia, c'est pourquoi "commencer par". C'est une tentative de minimiser les changements.
@LightnessRacsinorbit, vous pouvez être mal guidé maintenant à être fier de votre commentaire spirituel.
Y a-t-il eu une offensive? :)
@Matteoitalia: Pourquoi un énorme exécutable? C'est une déclaration ininitialisée, n'est-ce pas?
@Harryjohnston: Oui, regarder le code maintenant, il semble le cas; Je ne sais pas ce que je pensais il y a trois ans. : - /
Vous n'avez pas besoin de mettre les tableaux sur la pile en main (), vous pouvez aussi bien les affecter statiquement avant d'entrer dans la fonction. Cela les mettra dans une zone qui n'est pas limitée par la taille de la pile par défaut.
unsigned char cmain[are];
int array_inst[64]={0};
DataStructure_trus va;
DataStructure_init in;
int main() {
ftrus(cmain,array_inst,va);
finit(va,in);
cin.get();
}
Cela traverse des merveilles, déclarant la structure de données en dehors de la principale, même avec «sont» comme 20 000 programmes s'exécute sans pépin.
Qu'est-ce que tout le monde a dit: Vous essayez d'allouer beaucoup de choses sur la pile. Un lot em>. Au lieu de cela, allouez de manière dynamique la mémoire tampon de mémoire ... en utilisant un conteneur standard pour la gestion de la mémoire: p>
Chaque fois que j'utilise des vecteurs, mes programmes sont à deux reprises, je sais que c'est mon implémentation qui est le problème.
Ensuite, vous utilisez de manière incorrecte les vecteurs. Lorsque vous avez correctement RESERVE CODE> CAPACITÉ possible, l'utilisation de vecteur a la même vitesse que celle des tableaux. Les conteneurs standard sont la bonne approche ici. Ils s'occupent de l'allocation et du nettoyage pour vous. Et ils sont libres.
De plus, si vous activez des optimisations, il doit fonctionner aussi vite qu'avec un tableau de style C normal, car, une fois que les appels code> sont définis, le code généré doit être identique.
Intéressant que vous écrivez " juste i> 130 000 éléments". Sur quelle base supposez-vous que ce n'est pas beaucoup?
Alors, puis-je faire quelque chose comme cela créer un pointeur dans la structure de données et allouer l'espace de manière dynamique dans la principale?
EN.CPPREFERFERATION.COM/W/CPP/CONTAINER/Vector jcatki.no-ip.org/fncpp/resources
@ Lightness Courses: Eh bien, je n'ai eu aucun problème à créer des tableaux de taille unique avec 250 000 éléments, donc j'ai supposé que 130 000 n'était pas beaucoup et que le système aurait dû manipuler cela. Je n'ai pas réalisé qu'il y avait une limite de pile.
250 000 Quoi de I>? 130 000
int code> s est susceptible d'être d'au moins 520k. Selon la place de votre programme où vous l'utilisez et la quantité de mémoire est prise par Autres choses i> sur la pile, cela pourrait vous pousser sur le dessus de votre pile.Comment puis-je découvrir la limite de ma pile?
Je ne suis pas vraiment sûr. Je sais que vous pouvez, mais je ne l'ai jamais fait moi-même parce que ce serait la mauvaise façon de programmer. Quelqu'un d'autre peut rappeler comment le déterminer pour la curiosité.