Voici un exemple notable vidéo ( Arrêtez d'enseigner le C ) sur ce changement de paradigme à prendre dans l'enseignement du langage C++.
Et un article de blog également remarquable
Je rêve que les soi-disant cours/classes/curriculums C++ cessent d'enseigner (d'exiger) à leurs étudiants d'utiliser : ...
Depuis que le C++11 est devenu une norme établie, nous avons le Gestion dynamique de la mémoire installations aka pointeurs intelligents .
Même à partir de normes antérieures, nous avons la norme c++. Bibliothèque de conteneurs comme un bon remplacement pour les tableaux bruts (alloués avec des new T[]
) (notamment l'utilisation de std::string
au lieu du style c NUL
des tableaux de caractères terminés).
Question(s) en en gras :
Laissez de côté le placement new
outrepasser, Existe-t-il un cas d'utilisation valable qui ne peut pas être réalisé en utilisant des pointeurs intelligents ou des conteneurs standard, mais uniquement en utilisant les éléments suivants new
y delete
directement (outre la mise en œuvre de ces classes de conteneurs/pointeurs intelligents, bien sûr) ?
C'est parfois rumeur : (comme ici o ici ) qu'en utilisant new
y delete
le laminé à la main peut être "plus efficace" pour certains cas. Lesquelles sont en fait ? Ces cas limites ne doivent-ils pas assurer le suivi des allocations de la même manière que les conteneurs standard ou les pointeurs intelligents ?
Presque la même chose pour les tableaux de taille fixe de style c brut : Il y a std::array
de nos jours, ce qui permet de réaliser toutes sortes de travaux, de copies, de références, etc. de manière simple et syntaxiquement cohérente, comme l'attend tout le monde. Y a-t-il des cas d'utilisation pour choisir un T myArray[N];
de style c, de préférence à std::array<T,N> myArray;
?
En ce qui concerne l'interaction avec les bibliothèques de tiers :
En supposant qu'une bibliothèque tierce renvoie des pointeurs bruts alloués avec new
comme
MyType* LibApi::CreateNewType() {
return new MyType(someParams);
}
vous pouvez toujours l'envelopper dans un pointeur intelligent pour vous assurer que delete
s'appelle :
std::unique_ptr<MyType> foo = LibApi::CreateNewType();
même si l'API exige que vous appeliez leur ancienne fonction pour libérer la ressource, par exemple
void LibApi::FreeMyType(MyType* foo);
vous pouvez toujours fournir une fonction de suppression :
std::unique_ptr<MyType, LibApi::FreeMyType> foo = LibApi::CreateNewType();
Je suis particulièrement intéressé par les documents valides "tous les jours" par opposition aux objectif académique/éducatif des exigences et des restrictions qui ne sont pas couvertes par les installations standard mentionnées.
Ce new
y delete
peut être utilisé dans des cadres de gestion de la mémoire / garbage collector ou la mise en œuvre de conteneurs standard est hors de question. 1 .
Une motivation majeure ...
... poser cette question est de donner une approche alternative à toutes les questions (devoirs), qui sont limitées à l'utilisation de l'une des constructions mentionnées dans le titre, mais des questions sérieuses sur le code prêt pour la production.
On les appelle souvent les notions de base de la gestion de la mémoire, qui est, selon l'OMI, manifestement erronée/mal comprise comme convenant pour débutants les conférences et les tâches.
1) <strong>Ajouter.. : </strong>En ce qui concerne ce paragraphe, cela devrait indiquer clairement que <code>new</code> y <code>delete</code> n'est pas destiné aux étudiants débutants en c++, mais devrait être laissé pour les cours plus avancés.