Documentation PostgreSQL 14.22 » Programmation serveur » Interface de programmation serveur » Gestion de la mémoire

Précédent | Niveau supérieur | Suivant
SPI_result_code_string | Sommaire | SPI_palloc

## 47.3. Gestion de la mémoire

PostgreSQL alloue de la mémoire dans des contextes mémoire qui donnent une méthode pratique pour gérer les allocations faites dans plusieurs endroits qui ont besoin de vivre pour des durées différentes. Détruire un contexte libère toute la mémoire qui y était allouée. Donc, il n'est pas nécessaire de garder la trace des objets individuels pour éviter les fuites de mémoire ; à la place, seul un petit nombre de contextes doivent être gérés. `palloc` et les fonctions liées allouent de la mémoire du contexte « courant ».

`SPI_connect` crée un nouveau contexte mémoire et le rend courant. `SPI_finish` restaure le contexte mémoire précédant et détruit le contexte créé par `SPI_connect`. Ces actions garantissent que les allocations temporaires de mémoire faites dans votre fonction C soient réclamées lors de la sortie de la fonction C, évitant les fuites de mémoire.

En revanche, si votre fonction C a besoin de renvoyer un objet dans de la mémoire allouée (tel que la valeur d'un type de donnée passé par référence), vous ne pouvez pas allouer cette mémoire en utilisant `palloc`, au moins pas tant que vous êtes connecté à SPI. Si vous essayez, l'objet sera désalloué par `SPI_finish` et votre fonction C ne fonctionnera pas de manière fiable. Pour résoudre ce problème, utilisez `SPI_palloc` pour allouer de la mémoire pour votre objet de retour. `SPI_palloc` alloue de la mémoire dans le « contexte de mémoire courant », c'est-à-dire le contexte de mémoire qui était courant lorsque `SPI_connect` a été appelée, ce qui est précisément le bon contexte pour une valeur renvoyée à partir de votre fonction C. Plusieurs autres procédures utilitaires décrites dans cette section renvoient également des objets créés dans le contexte mémoire de l'appelant.

Quand `SPI_connect` est appelée, le contexte privé de la fonction C, qui est créé par `SPI_connect`, est nommé le contexte courant. Toute allocation faîte par `palloc`, `repalloc` ou une fonction utilitaire SPI (à part celles décrites dans cette section) sont faites dans ce contexte. Quand une fonction C se déconnecte du gestionnaire SPI (via `SPI_finish`), le contexte courant est restauré au contexte de mémoire courant et toutes les allocations faites dans le contexte de mémoire de la fonction C sont libérées et ne peuvent plus être utilisées.