J'apprends C ++ et surtout la programmation OO.
Mon programme Utilisez des pointeurs pour faire face à une allocation de mémoire dynamique. P>
Tout en créant mon constructeur par défaut, je m'ennuyais de répéter avec p >
Annonce::Annonce(string Titre, long double Prix, string Intro, string Description, vector<vector<string>> ImgUrls) {
titre = new string;
intro = new string;
description = new string;
imgUrls = new vector<vector<string>>;
prix = new long double;
id = new size_t;
*id = nbAnnonces;
*titre = std::move(Titre);
*prix = Prix;
*intro = std::move(Intro);
*description = std::move(Description);
*imgUrls = std::move(ImgUrls);
}
3 Réponses :
Il n'y a pas de raccourci pour attribuer plusieurs variables de la mémoire dynamique. p>
Les fonctions d'allocation de mémoire renvoient une seule adresse mémoire (pointeur). Chaque variable doit avoir son propre emplacement en mémoire. p>
La syntaxe de la langue C ++ devrait modifier afin de prendre en charge les fonctions de mémoire dynamiques qui renvoient plusieurs adresses (pointeurs). p>
Une recommandation est de réduire la quantité d'allocations de mémoire. Demandez-vous: "Est-ce que j'ai vraiment besoin d'allouer de la mémoire dynamique?" avant d'attribuer de la mémoire dynamique. p>
Première suggestion de réponse: ne le faites pas.
Deuxième pré-réponse Suggestion: Évitez la répartition de la mémoire autogérée / distribution et utilisez des conteneurs STL et / ou des pointeurs intelligents ( réponse: non, aussi loin que je sais que vous ne pouvez pas écrire quelque chose comme p> qui alloue les deux variables (avec différents pointeurs alloués). P> Mais vous pouvez envelopper les pointeurs d'une classe ou d'une structure qui alloue automatiquement le pointeur contenu (et, peut-être, le détruire dans le destructeur ). P> juste pour le plaisir ... Si vous écrivez un wrapper comme suit p> Vous pouvez écrire votre std :: unique_ptr code >, std :: partagé_ptr code>, etc.) au lieu de p> annonce code> Way P> struct Annonce
{
wrappPnt<std::string> titre, intro, description;
wrappPnt<std::vector<std::vector<std::string>>> imgUrls;
wrappPnt<long double> prix;
Annonce (std::string Titre, long double Prix, std::string Intro,
std::string Description,
std::vector<std::vector<std::string>> ImgUrls)
{
*titre = std::move(Titre);
*prix = Prix;
*intro = std::move(Intro);
*description = std::move(Description);
*imgUrls = std::move(ImgUrls);
}
};
Y a-t-il un moyen d'écrire quelque chose comme: p>
void foo(int x) { auto p = std::make_unique<p>(); p.get() = x; // do stuff with p // ... // no need to delete p at the end of the function }
- Pas besoin d'utiliser
nouveau code>, toujours. li>- Pas besoin de supprimer quoi que ce soit. Li>
- aucune chance de fuites de mémoire (en raison de cette classe) li> ul>
2. Sinon, utilisez
std :: unique_ptr code> 's h3>le
std :: unique_ptrclasse vous permet d'éviter de devoir gérer vous-même la mémoire. Il prend en charge cela. Donc, si vous faites vos membrescode> std :: unique_ptr code>'s, vous pouvez initialiser la valeur qu'ils indiquent à l'aide deget () code>, par exemple: p>myInt, myOtherInt = new int;
"Mon programme utilise des pointeurs pour faire face à une allocation de mémoire dynamique." Cela doit-il? Au lieu de votre classe consistant à
std :: string * code> etstd :: vecteur <> * code>, peut-il juste tenirstd :: chaîne code> etstd :: vecteur code>? Ces objets gèrent eux-mêmes l'allocation de mémoire dynamique. Nous n'avons donc pas besoin.J'ai 99,9% certains que vous n'avez pas besoin de ces indicateurs. Regardez-y pour la façon dont un constructeur devrait regarder: Stackoverflow.com/questions/1711990/...
myint = nouveau int; code> devrait être quelque chose que vous ne faites presque jamais. Même avecintro = nouvelle chaîne; code>Vous ne devriez presque jamais utiliser
nouveau code> directement (à l'exception potentiellement comme argument à E.G.std :: partagé_ptr code> oustd :: unique_ptr code> membres). Les exemples que vous montrez ici en particulier sont clairement faux. Voir Pourquoi les programmeurs C ++ doivent-ils minimiser l'utilisation de «Nouveau»? . Si votre matériel pédagogique vous a appris à écrire C ++ comme ceci, alors je vous suggère d'arrêter d'utiliser ce matériau et de regarder l'un des Recommandé C ++ Livres à la place.No
myint, myotherint = nouveau INT; code> ne fonctionnera pas. Recherchez ce que l'opérateur de la virgule fait parce qu'il ne fait pas ce que vous voudriez.C ++ n'est pas Java.
Nouveau code> peut être de routine en Java, mais il doit être évité ou minimisé en C ++, pour des raisons que la noix pointait.@John non, ça ne fait pas que j'apprends et j'écris donc seulement pour apprendre des pointeurs et soyez bien avec eux.
@LAURENT Bien que ce soit certainement quelque chose que vous pouvez apprendre, l'une des fonctionnalités de C ++ est la rarement nécessaire de travailler avec une allocation de mémoire dynamique. Pour répondre à votre question, je m'éloignerais d'un moyen plus rapide d'écrire une "nouvelle chaîne" encore et encore à nouveau à tout le moins afin que cela laisse un mauvais goût dans la bouche.
@Nathanoliver la même chose que je réponds à John, il suffit d'apprendre comment les pointeurs fonctionnent et que je n'en ai pas besoin.
@walnut Merci beaucoup pour les liens qu'il est très utile. J'apprendais sur Udemy et avec le livre de Bjarne Stroustrup.
En savoir plus sur la règle de 3/5 / 0. Si vous utilisez des pointeurs dans vos classes, vous devrez suivre la règle de 3 ou 5 au lieu de la règle de 0. https://fr.cppreference.com/w/cpp/language/rule_of_three