6 votes

quand la mémoire sera-t-elle libérée ?

J'ai créé un bloc de code, comme ceci.

proc()
{
    Z* z = new Z();
}

maintenant le pointeur déclaré dans la méthode proc n'aura de portée que jusqu'à proc. Je veux savoir quand le DTOR pour z sera appelé automatiquement, soit lorsque les contrôles sortent de la méthode proc, soit lorsque mon application est fermée.

17voto

NPE Points 169956

Le destructeur ne sera pas appelé du tout. La mémoire utilisée par *z sera perdue jusqu'à ce que l'application soit fermée (le système d'exploitation récupérera alors toute la mémoire utilisée par votre processus).

Pour éviter la fuite, vous devez appeler delete à un moment donné ou, mieux encore, utiliser des pointeurs intelligents.

12voto

James Kanze Points 96599

C'est une fuite de mémoire. Ce que vous devriez probablement faire est :

void
proc()
{
    Z z;
}

et de sauter l'allocation dynamique. Si la durée de vie d'un objet correspond à sa portée, l'allocation dynamique est rarement nécessaire.

Si, pour une raison quelconque, vous avez besoin d'une allocation dynamique (par exemple à cause de polymorphisme), vous devez alors utiliser une sorte de pointeur intelligent ; std::auto_ptr fonctionne bien ici, et des choses comme scoped_ptr si vous peuvent être encore meilleures.

7voto

Andrejs Cainikovs Points 7758

C'est l'un des principes fondamentaux du C++.

Allocation dynamique

Dans votre cas, l'allocation de la mémoire et l'appel conséquent du constructeur pour Z se produira le new :

Z* z = new Z();

La partie opposée pour la destruction et la désallocation de la mémoire se produira sur delete :

delete z;

Mais puisque votre code ne l'a pas, la désallocation de la mémoire n'aura jamais lieu, et vous perdrez le pointeur. z n'ayant aucune possibilité de désallouer l'objet dans le futur. C'est une fuite de mémoire typique.

Déclaration

D'autre part, si vous déclarez un objet comme ceci :

Z z;

L'allocation de mémoire et le constructeur seront appelés immédiatement ici, au point de déclaration, et lorsque la portée de l'existence de l'objet sera terminée (c'est-à-dire à la fin de la fonction), le destructeur sera appelé automatiquement et la mémoire sera désallouée.

Allocation dynamique vs Déclaration

Je n'entrerai pas dans le débat sur ce qui est mieux et ce qui ne l'est pas, mais je vous fournirai plutôt l'extrait d'un des articles dont le lien figure ci-dessous :

Contrairement aux déclarations, qui chargent des données sur le segment de données du programme, l'allocation dynamique crée un nouvel espace utilisable sur la STACK du programme (une zone de RAM spécifiquement allouée à ce programme).

FYI : Pile = Performance pero pas toujours la meilleure solution .

Références

Pour votre plaisir : tic tac orteil .

4voto

Ed Heal Points 24309

Vous allez avoir une fuite de mémoire à moins que vous ne passiez z a delete .

1voto

ethereal Points 31

DTOR ne sera pas appelé automatiquement. Vous devez utiliser le mot clé "delete".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X