wchar_t pointeur
Quel est le problème avec ceci:
wchar_t * t = new wchar_t;
t = "Tony";
Je pensais que je pouvais utiliser un wchar_t pointeur comme une chaîne de caractères...
double possible de Quel est le problème avec ce code? ou stackoverflow.com/questions/1577765/...
OriginalL'auteur Tony The Lion | 2010-06-24
Vous devez vous connecter pour publier un commentaire.
Votre code à deux questions.
D'abord,
"Tony"
est un pointeur vers une chaîne dechar
'.L"Tony"
est la grande chaîne.Deuxième, vous allouer une seule
wchar_t
par le biais des nouvelles, puis immédiatement perdre la trace en réaffectant le pointeur de Tony. Il en résulte une fuite de mémoire.wchar_t* t = L"Tony";
. Ce serait déclarer un pointeur et initialiser le point de la statique (large) de la chaîne de "Tony".La syntaxe Doit être réellement
wchar_t const* t = L"Tony";
. Pour comprendre pourquoi, considérons la déclaration*(t+1) = L'i';
OriginalL'auteur Michael
Un pointeur juste points à une seule valeur. Ce qui est important.
Tout ce que vous avez fait est alloué un espace pour un seul
wchar_t
, et point. Ensuite, vous essayez de mettre le pointeur sur une chaîne de caractères (rappelez-vous, juste sur le premier caractère), mais la chaîne est de type incorrect.Ce que vous avez est une chaîne de
char
, il "devrait" êtreL"Tony"
. Mais tout ce que vous faites ici est une fuite de votre précédente allocation de mémoire parce que le pointeur est titulaire d'une nouvelle valeur.Plutôt que vous souhaitez allouer assez de place pour contenir la totalité de la chaîne, puis copie la chaîne dans ce mémoire allouée. C'est terrible la pratique, cependant, jamais faire quelque chose qui vous fait vous devez explicitement libérer de la mémoire.
Suffit d'utiliser
std::wstring
et de progresser.std::wstring t = L"Tony";
. Il s'occupe de tous les détails, et vous n'avez pas besoin de s'inquiéter au sujet de nettoyer quoi que ce soit.std::wstring
, le meilleur des conseils.Pourquoi je vous remercie. 🙂
Excellente réponse.
OriginalL'auteur GManNickG
Ce que cela fait, c'est d'abord affecter un pointeur vers un nouvellement allouée
wchar_t
ent
, et puis essayer d'attribuer un non à l'échelle de la chaînet
.Pouvez-vous utiliser
std::wstring
à la place? Qui va gérer l'intégralité de votre mémoire besoins de gestion pour vous.C'est très mauvais. wstring est
typedef
'ed commebasic_string<wchar_t>
et existe sur tous compatible C++/toolchain.l'en-tête
<string>
définit également deux classes de modèlesstring
etwstring
et leurs traits de personnalité particuliers."Radzivilovsky wstring est la norme (au moins la cppreference dit que c'est cppreference.com/wiki/string/start et tous les wstring wstringstream,wcin,... classes de travailler avec g++) la seule chose ici pourrait être microsoft pas la mise en œuvre de la norme c++.
Ils ont fait de mettre en œuvre un assez standard
wstring
en 98, dans leur VC6 libération. Les versions plus récentes ont supprimé certains mineurs non-conformités dans leurwstring
mise en œuvre. (Le plus important était quewchar_t
était une définition de type de VC6)OriginalL'auteur Mark B
Puisque vous êtes un développeur C# je ferai remarquer quelques choses c++ ne différent.
Ce alloue un nouveau wchar_t et l'attribue à t
C'est un tableau de constantes char
Pour obtenir une constante wchar_t tableau préfixe avec L
Ce reasigns t le point de la constante de L"Tony" à la place de votre ancien wchar_t et provoque une fuite de mémoire depuis votre wchar_t ne sera jamais libéré.
Cela crée une chaîne de caractères de large (wchar_t) afin de conserver une copie de L"Tony"
Je pense que la dernière ligne est ce que vous voulez. Si vous avez besoin d'accéder à la wchar_t pointeur utilise t.c_str(). A noter que c++ et elles sont modifiables et sont copiés sur chaque mission.
Le c façon de le faire serait
Ce n'est pas de créer une copie et seulement affecte le pointeur de la const wchar tableau
OriginalL'auteur josefx
vous pouvez, c'est juste que "Tony" est une chaîne codée en dur, et ils sont ANSI par défaut dans la plupart des éditeurs/compilateurs. Si vous voulez dire à l'éditeur de vous en train de taper une chaîne Unicode, puis faites-le précéder L, par exemple
t = L"Tony"
.Vous avez d'autres problèmes avec votre code, votre allocation est l'allocation d'un caractère Unicode (2 octets), alors vous êtes en essayant de pointer la variable d'origine de la chaîne constante, donc les fuites de ces 2 octets.
Si vous souhaitez créer un tampon de données Unicode et place des données, que vous voulez faire:
OriginalL'auteur gbjbaanb
ce qui est totalement faux.
Il n'y a pas besoin d'allouer deux octets, faire t pour pointer vers eux, puis écraser le pointeur de t qui fuit la mémoire perdue pour toujours.
Aussi, "Tony" a un type différent. Utilisation:
wchar_t *t = L"Tony";
À mon humble avis mieux ne pas utiliser wchars à tous - Voir https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful
fixe, thx. un tpyo..
Aussi un wchar_t n'est pas nécessairement deux octets. Dans la version de gcc, je suis en utilisant un wchar_t est de 4 octets, et la norme dit que c'est le compilateur spécifique. Il peut même être un seul octet.
OriginalL'auteur Pavel Radzivilovsky