2011-08-18 2 views
4

Pour cela: m_sFilename = new char [len+1];Est-ce que "new char []" doit être libéré manuellement?

Dois-je appeler delete[] m_sFilename; quelque temps?

Et:

dois-je utiliser delete[] m_sFilename ou delete m_sFilename;?

+0

Dans un sens précis, non, vous n'avez pas besoin; vous devriez probablement, si vous le pouvez; le résultat d'un échec à le faire pourrait aller d'un comportement complètement inoffensif à une fuite de mémoire provoquant un accident. – Patrick87

+1

Quel genre de livre de langage C++ horrible utilisez-vous? Obtenez un autre. –

+0

Parfois? Pourquoi appelez-vous une certaine fonction un jour et pas à d'autres moments? – Jaywalker

Répondre

7

Est-ce que "new char []" doit être libéré manuellement?

Oui.

Pour cela: m_sFilename = new char [len+1]; Dois-je appeler delete[] m_sFilename; quelque temps?

Oui.

Dois-je utiliser delete[] m_sFilename ou delete m_sFilename;?

delete[].


Mais vous devriez fait usage std::string, qui fait tout cela pour vous, et est gratuit.

+0

Alors que la suggestion d'utiliser 'std :: string' est correcte mais je crois qu'elle est mal placée. Ne devrait-on pas d'abord apprendre à utiliser 'new []' et 'delete []' pratiquement au lieu de se cacher derrière 'std :: string'? – Jaywalker

+1

@Jaywalker: Pas avec 'char'. Et, en allant plus loin, on pourrait même dire que 'std :: vector' et' std :: string' devraient être appris avant d'entrer dans les détails comme les tableaux et l'allocation dynamique. Malheureusement, pour des raisons historiques, le C++ n'est pratiquement jamais enseigné de cette façon. –

+1

@Jaywalker - La première chose que vous auriez à faire avec 'new []' et 'delete []' est de réécrire l'équivalent de 'std :: string'. De leur propre chef, ils ne sont pas sûrs. – Mankarse

4

Oui, si vous ne voulez pas que la mémoire allouée par le new[] fuit, vous devez le delete[] lorsque vous avez terminé d'utiliser cette mémoire.

Pour éviter d'avoir à garder une trace de cette mémoire, je vous recommande d'utiliser std::string ou std::vector à la place.

+0

* * pinailler ne pas appeler 'supprimer []' un pointeur alloué avec 'nouveau []' cause techniquement un comportement non défini ** **, dont les résultats les plus probables dans une fuite de mémoire ** * * dans ce cas. –

+0

donc, delete [] m_sFilename est le bon. Droite? –

+0

@Als: Où est-il indiqué que c'est UB? Si vous pensez à n3290 '3.8/4'," [..] cependant, s'il n'y a pas d'appel explicite au destructeur ou si une expression-delete (5.3.5) n'est pas utilisée pour libérer le stockage, le destructeur ne doit pas être implicitement appelé et tout programme qui dépend des effets secondaires produits par le destructeur a un comportement indéfini. ", alors je ne pense pas que cela s'applique. –

2

Oui, mais utilisez std::string pour stocker m_sFilename à la place - c'est mieux à peu près tout.

0

Pour les types de données natifs, et les types de données définis par l'utilisateur n'ayant pas de destructeurs utilisant delete ou delete[] signifieraient la même chose. Le gestionnaire de tas sous-jacent libérerait toute la mémoire. Mais appeler le scaler delete sur un nouveau vecteur (new[]) ne fera pas appeler tous les destructeurs. Les destructeurs ne seront appelés qu'une seule fois pour le tout premier objet.

Le comportement indiqué ci-dessus dépend du compilateur/heap-manager (qui gère new et delete). Pour une meilleure portabilité, utilisez la fonction scaler delete pour le nouveau scaler et le vecteur delete (delete[]) pour le vecteur new.

Questions connexes