PostgreSQLLa base de données la plus sophistiquée au monde.

Version anglaise

46.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 faîtes 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 faîtes 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é 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 faîtes 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 faîtes dans le contexte de mémoire de la fonction C sont libérées et ne peuvent plus être utilisées.