Maison  >  Article  >  développement back-end  >  Comment convertir en toute sécurité char en wchar_t dans une application Unicode ?

Comment convertir en toute sécurité char en wchar_t dans une application Unicode ?

DDD
DDDoriginal
2024-11-03 09:11:03542parcourir

How to Safely Convert char to wchar_t in a Unicode Application?

Conversion de char en wchar_t : résolution d'un comportement non défini

Dans une application Unicode, l'intégration de chaînes de caractères standard nécessite la conversion de char en wchar_t. Cependant, les tentatives d'implémentation de cette conversion rencontrent souvent un comportement indéfini.

Considérez la fonction suivante :

const wchar_t *GetWC(const char *c)
{
    const size_t cSize = strlen(c)+1;
    wchar_t wc[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
}

Cette fonction alloue un tableau de wchar_t, convertit le char en wchar_t, et renvoie le pointeur vers wc. Cependant, wc est une variable locale qui est désallouée à la fin de la fonction, ce qui entraîne un comportement indéfini lorsque le pointeur renvoyé est déréférencé.

Correction du problème

L'erreur peut être corrigée en allouant le tableau wchar_t* dynamiquement au sein de la fonction :

const wchar_t *GetWC(const char *c)
{
    const size_t cSize = strlen(c)+1;
    wchar_t* wc = new wchar_t[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
}

Cette allocation dynamique garantit que la mémoire persistera au-delà de la durée de vie de la fonction.

Responsabilités de l'appelant

C'est crucial à noter que l'appelant de GetWC() est désormais responsable de la désallocation de la mémoire allouée. Ne pas le faire entraînera une fuite de mémoire.

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