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;
?
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;
?
Est-ce que "new char []" doit être libéré manuellement?
Oui.
Pour cela:
m_sFilename = new char [len+1];
Dois-je appelerdelete[] m_sFilename;
quelque temps?
Oui.
Dois-je utiliser
delete[] m_sFilename
oudelete m_sFilename;
?
delete[]
.
Mais vous devriez fait usage std::string
, qui fait tout cela pour vous, et est gratuit.
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
@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. –
@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
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.
* * 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. –
donc, delete [] m_sFilename est le bon. Droite? –
@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. –
Oui, mais utilisez std::string
pour stocker m_sFilename
à la place - c'est mieux à peu près tout.
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
.
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
Quel genre de livre de langage C++ horrible utilisez-vous? Obtenez un autre. –
Parfois? Pourquoi appelez-vous une certaine fonction un jour et pas à d'autres moments? – Jaywalker