tl;dr: Ce n'est pas que l'allocation de mémoire dynamique est intrinsèquement non-déterministe (comme vous l'a défini en termes identiques (les chemins d'exécution); c'est que généralement votre programme imprévisible. Plus précisément, vous ne pouvez pas prédire si l'allocateur peut échouer face à l'arbitraire de la séquence d'entrées.
Vous pourriez avoir un non-déterministe de l'allocateur. C'est en fait commune à l'extérieur de votre temps réel de monde, où les systèmes d'exploitation utilisent des choses comme la présentation de l'adresse de la randomisation. Bien sûr, cela ferait de votre programme de non-déterministe.
Mais ce n'est pas un cas intéressant, supposons donc parfaitement déterministe de l'allocateur: la même séquence d'allocations et de deallocations entraînera toujours les mêmes blocs, dans les mêmes lieux et de ces allocations et deallocations aura toujours bornée de temps de fonctionnement.
Maintenant, votre programme peut être déterministe: le même ensemble d'entrées de conduit exactement le même chemin d'exécution.
Le problème est que si vous êtes d'allouer et de libérer de la mémoire en réponse aux intrants, vous ne pouvez pas prédire si une allocation jamais échouer (et l'échec n'est pas une option).
Tout d'abord, votre programme peut présenter une fuite de mémoire. Donc, si il a besoin pour fonctionner indéfiniment, éventuellement une allocation échoue.
Mais même si vous pouvez prouver il n'y a pas de fuites, vous devez savoir qu'il n'y a jamais une séquence d'entrée qui pourrait demander plus de mémoire que ce qui est disponible.
Mais même si vous pouvez prouver que le programme n'aura jamais besoin de plus de mémoire que ce qui est disponible, l'allocation peut, en fonction de la séquence des allocations et libère, fragment de la mémoire et donc, à terme, être incapable de trouver un bloc contigu de satisfaire à une allocation, même si il y a suffisamment de mémoire disponible dans l'ensemble.
Il est très difficile de prouver qu'il n'y a pas de séquence d'entrées qui conduira à pathologiques de la fragmentation.
Vous pouvez concevoir des allocateurs de garantie il n'y aura pas de fragmentation (par exemple, par l'attribution de blocs d'une seule taille), mais qui met une importante contrainte sur l'appelant et, éventuellement, augmente la quantité de mémoire nécessaire en raison de la quantité de déchets. Et l'appelant doit encore prouver qu'il n'y a pas de fuites et qu'il y a un satiable de la limite supérieure sur le total de la mémoire requise quelle que soit la séquence d'entrées. Ce fardeau est si élevé qu'il est en fait plus simple de concevoir le système de sorte qu'il ne peut pas utiliser l'allocation dynamique de la mémoire.