Maison  >  Article  >  développement back-end  >  Pourquoi l'utilisation de malloc() avec l'initialisation de chaîne C entraîne-t-elle des erreurs de segmentation ?

Pourquoi l'utilisation de malloc() avec l'initialisation de chaîne C entraîne-t-elle des erreurs de segmentation ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-15 05:38:02777parcourir

Why Does Using malloc() with C   string Initialization Lead to Segmentation Faults?

Comment gérer l'initialisation d'une chaîne C lorsque la mémoire est allouée avec malloc() ?

En C, tenter d'utiliser la fonction malloc() pour créer une structure contenant un std::string peut entraîner des erreurs de segmentation. Pour comprendre ce problème, considérons l'exemple suivant :

struct example {
  std::string data;
};

int main() {
  example *ex = (example *)malloc(sizeof(*ex)); // Allocating memory for the structure
  ex->data = "hello world";                   // Assigning a value to the std::string member
  std::cout << ex->data << std::endl;       // Printing the value of the std::string member
}

Lors de l'exécution de ce code, une erreur de segmentation se produit. Cela se produit car une simple allocation de mémoire à l'aide de malloc() n'initialise pas correctement l'objet std::string dans la structure.

Solution : utiliser un nouvel opérateur

Pour résoudre ce problème problème, évitez d'utiliser malloc() lorsque vous travaillez avec des classes ou des structures contenant des constructeurs non triviaux, tels que std::string. Au lieu de cela, utilisez l'opérateur new pour allouer de la mémoire et construire l'objet correctement :

example *ex = new example; // Allocating memory and constructing the object
ex->data = "hello world";
std::cout << ex->data << std::endl;

Technique avancée : placement nouveau avec malloc()

Alternativement, si vous insistez Lors de l'utilisation de malloc(), vous pouvez utiliser une technique appelée "placement new" :

void *ex_raw = malloc(sizeof(example)); // Raw memory allocation
example *ex = new(ex_raw) example;      // Placement new to construct the object

Cependant, il est fortement recommandé d'utiliser le nouvel opérateur pour la simplicité et la sécurité.

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