Est-il nécessaire de détruire char * = « string » ou char * = new char[6] ?

StackOverflow https://stackoverflow.com/questions/51592

  •  09-06-2019
  •  | 
  •  

Question

Je suppose que char* = "string" est la même chose pour char* = new char[6].Je crois que ces chaînes sont créées sur le tas plutôt que sur la pile.Alors, dois-je les détruire ou libérer leur mémoire lorsque j'ai fini de les utiliser ou sont-ils détruits par eux-mêmes ?

Était-ce utile?

La solution

Non.Vous n'avez besoin de libérer manuellement les chaînes que lorsque vous allouez manuellement la mémoire vous-même à l'aide du malloc fonction (en C) ou la new opérateur (en C++).Si vous n'utilisez pas malloc ou new, puis le char* ou une chaîne sera créée sur la pile ou en tant que constante de compilation.

Autres conseils

Non.Quand tu dis:

const char* c = "Hello World!";

Vous affectez c à une constante de chaîne "préexistante" qui n'est PAS la même que :

char* c = new char[6];

Ce n'est que dans ce dernier cas que vous allouez de la mémoire sur le tas.Vous appelleriez donc delete lorsque vous aurez terminé.

Je suppose que quand je le fais char* = "string" c'est la même chose que char* = new char[6].

Non.Le premier fait créer une constante.Le modifier est un comportement indéfini.Mais pour répondre à votre question ;non, vous n'êtes pas obligé de les détruire.Et juste une note, utilisez toujours std::string dès que possible.

Le nom du jeu est « détruisez uniquement ce que vous avez créé ».Voici les paires :

  1. malloc/free
  2. calloc/free
  3. new/delete
  4. new []/delete []

Depuis que vous avez créé la 2ème chaîne en utilisant new [], il vous incombe de le détruire avec delete [].Appel delete [] string2 quand tu as fini.

Maintenant, si votre code est suffisamment compliqué et rend difficile le suivi des suppressions, envisagez l'utilisation de pointeurs étendus ou de pointeurs automatiques.Le boost::scoped_ptr la classe de la bibliothèque boost est un bon point de départ.Examinez également le RAII idiome, truc assez pratique et utile.

Ce ne sont pas les mêmes.Votre premier exemple est une chaîne constante, elle n'est donc certainement pas allouée à partir du tas.Votre deuxième exemple est une allocation de mémoire d'exécution de 6 caractères, et cela provient du tas.Vous ne souhaitez pas supprimer votre premier exemple, mais vous devez delete [] votre deuxième exemple.

Vous ne savez pas où sont stockés les littéraux de chaîne.Il peut même s'agir de mémoire en lecture seule, votre code devrait donc se lire :

const char* c = "string";

Et un nouveau le tableau de caractères devrait être supprimerd comme n’importe quelle autre zone de mémoire allouée dynamiquement.

new est toujours une allocation alors que la définition d'une chaîne en ligne intègre en fait les données dans le programme lui-même et ne peut pas être modifiée (certains compilateurs le permettent par une astuce intelligente, ne vous embêtez pas).

Certains compilateurs tapent des chaînes en ligne afin que vous ne puissiez pas modifier le tampon.

char* const sz1 = "string"; // embedded string, immutable buffer
char* sz2 = new char[10]; // allocated string, should be deleted

Voyons ce que fait GCC 4.8 x86-64 Linux

Programme:

#include <cstdio>
int main() {
    const char *s = "abc";
    char *sn = new char[4];
    sn[3] = '\0';
    std::printf("%s\n", s);
    std::printf("%s\n", sn);
}

Compiler et décompiler :

g++ -ggdb -std=c++98 a.cpp
objdump -CSr a.o

La sortie contient :

  const char *s = "abc";
 8:   48 c7 45 f0 00 00 00    movq   $0x0,-0x10(%rbp)
 f:   00 
                     c: R_X86_64_32S .rodata
  char *sn = new char[4];
10:   bf 04 00 00 00          mov    $0x4,%edi
15:   e8 00 00 00 00          callq  1a <main+0x1a>
                        16: R_X86_64_PC32       operator new[](unsigned long)-0x4
1a:   48 89 45 f8             mov    %rax,-0x8(%rbp)

Interprétation:

  • char *s = "abc" entre dans .rodata.Donc tu ne peux pas free de quelque manière que ce soit.
  • char *sn = new char[4]; vient de la sortie de operator new[].Vous devriez donc le libérer lorsque vous le pouvez.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top