Maison >développement back-end >C++ >Comment puis-je allouer correctement de la mémoire pour les structures contenant std::strings en C ?

Comment puis-je allouer correctement de la mémoire pour les structures contenant std::strings en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-24 06:17:14704parcourir

How Can I Correctly Allocate Memory for Structures Containing std::strings in C  ?

Gestion des structures avec std::Strings en C : navigation dans l'allocation de mémoire

En C, lorsqu'il s'agit de structures contenant std::strings et en utilisant malloc(), certains pièges peuvent survenir. Prenons l'exemple suivant :

struct example {
 std::string data;
};

int main() {
 example *ex = (example *)malloc(sizeof(*ex));
 ex->data = "hello world";
 std::cout << ex->data << std::endl;
}

Lors de son exécution, ce programme plante avec une erreur de segmentation. Ce comportement découle de la nature inhérente de malloc() et de la construction de std::strings.

Maldvertising et allocation de mémoire

Contrairement à new, malloc() alloue simplement mémoire brute. Dans ce contexte, tenter d'utiliser la mémoire malloc() comme un objet « réel » peut conduire à des résultats indéfinis. Pour instancier correctement les objets en mémoire, utilisez new au lieu de malloc() :

example *ex = new example;

Tromper malloc() en coopération

Alternativement, en utilisant une combinaison de malloc () et l'opérateur de placement new, il est possible de construire des objets dans la mémoire malloc() :

void *ex_raw = malloc(sizeof(example));
example *ex = new(ex_raw) example;

Cependant, en utilisant ces techniques peut s'avérer inutile dans le cadre de la gestion de structures avec std::strings.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn