Namespaces
Variants

std:: realloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Défini dans l'en-tête <cstdlib>
void * realloc ( void * ptr, std:: size_t new_size ) ;

Réalloue la zone de mémoire donnée ( en créant implicitement des objets dans la zone de destination). Elle doit avoir été préalablement allouée par std::malloc , std::calloc ou std::realloc et ne pas encore avoir été libérée avec std::free , sinon, les résultats sont indéfinis.

La réallocation est effectuée par l'une des méthodes suivantes :

a) étendre ou contracter la zone existante pointée par ptr , si possible. Le contenu de la zone reste inchangé jusqu'à la plus petite des nouvelles et anciennes tailles. Si la zone est étendue, le contenu de la nouvelle partie du tableau est indéfini.
b) allouer un nouveau bloc mémoire de taille new_size octets, copier la zone mémoire avec une taille égale à la plus petite des nouvelles et anciennes tailles, et libérer l'ancien bloc.

S'il n'y a pas assez de mémoire, le bloc de mémoire ancien n'est pas libéré et un pointeur nul est retourné.

Si ptr est un pointeur nul, le comportement est le même que celui de l'appel à std:: malloc ( new_size ) .

Si new_size est zéro, le comportement est défini par l'implémentation : un pointeur nul peut être retourné (auquel cas l'ancien bloc mémoire peut être libéré ou non) ou un pointeur non nul peut être retourné qui ne peut pas être utilisé pour accéder au stockage. Un tel usage est déprécié (via C DR 400 ). (depuis C++20)

Les fonctions suivantes doivent être thread-safe :

Les appels à ces fonctions qui allouent ou désallouent une unité particulière de stockage se produisent dans un ordre total unique, et chaque appel de désallocation se produit-avant la prochaine allocation (le cas échéant) dans cet ordre.

(depuis C++11)

Table des matières

Paramètres

ptr - pointeur vers la zone mémoire à réallouer
new_size - nouvelle taille du tableau

Valeur de retour

En cas de succès, retourne un pointeur vers le début de la mémoire nouvellement allouée. Pour éviter une fuite mémoire, le pointeur retourné doit être désalloué avec std::free ou std::realloc . Le pointeur original ptr est invalidé et tout accès à celui-ci constitue un comportement indéfini (même si la réallocation s'est faite en place).

En cas d'échec, retourne un pointeur nul. Le pointeur original ptr reste valide et pourrait nécessiter une désallocation avec std::free .

Notes

Parce que la réallocation peut impliquer une copie octet par octet (qu'elle étende ou réduise la zone), il est nécessaire (mais pas suffisant) que ces objets soient de type TriviallyCopyable .

Certaines bibliothèques non standard définissent un trait de type "BitwiseMovable" ou "Relocatable", qui décrit un type qui ne possède pas :

  • références externes (par exemple, les nœuds d'une liste ou d'un arbre qui contiennent une référence à un autre élément), et
  • références internes (par exemple, un pointeur membre qui pourrait contenir l'adresse d'un autre membre).

Les objets de ce type peuvent être consultés après que leur stockage a été réalloué, même si leurs constructeurs de copie ne sont pas triviaux.

Exemple

#include <cassert>
#include <cstdlib>
#include <new>
class MallocDynamicBuffer
{
    char* p;
public:
    explicit MallocDynamicBuffer(std::size_t initial = 0) : p(nullptr)
    {
        resize(initial);
    }
    ~MallocDynamicBuffer() { std::free(p); }
    void resize(std::size_t newSize)
    {
        if (newSize == 0) // cette vérification n'est pas strictement nécessaire,
        {
            std::free(p); // mais realloc de taille zéro est déprécié en C
            p = nullptr;
        }
        else
        {
            if (void* mem = std::realloc(p, newSize))
                p = static_cast<char*>(mem);
            else
                throw std::bad_alloc();
        }
    }
    char& operator[](size_t n) { return p[n]; }
    char operator[](size_t n) const { return p[n]; }
};
int main()
{
    MallocDynamicBuffer buf1(1024);
    buf1[5] = 'f';
    buf1.resize(10); // réduction
    assert(buf1[5] == 'f');
    buf1.resize(1024); // agrandissement
    assert(buf1[5] == 'f');
}

Voir aussi

Documentation C pour realloc