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 ?
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!