указатель wchar_t - PullRequest
       11

указатель wchar_t

10 голосов
/ 24 июня 2010

Что не так с этим:

wchar_t * t = new wchar_t;

t = "Tony";

Я думал, что мог бы использовать указатель wchar_t в качестве строки ...

Ответы [ 6 ]

27 голосов
/ 24 июня 2010

Ваш код имеет две проблемы.

Во-первых, "Tony" - это указатель на строку из char. L"Tony" - соответствующая широкая строка.

Во-вторых, вы выделяете один wchar_t через new, а затем сразу теряете его, переназначая указатель на Tony. Это приводит к утечке памяти.

11 голосов
/ 24 июня 2010

Указатель просто указывает на одно значение. Это важно.

Все, что вы сделали, - это выделенное место для одного wchar_t и укажите на него. Затем вы пытаетесь установить указатель так, чтобы он указывал на строку (помните, только на первый символ), но тип строки неверный.

У вас есть строка char, она "должна" быть L"Tony". Но все, что вы здесь делаете, это утечка вашего предыдущего выделения памяти, потому что указатель содержит новое значение.

Скорее вы хотите выделить достаточно места для хранения всей строки, затем скопируйте строку в эту выделенную память. Это ужасная практика; никогда не делайте ничего, что заставляет вас явно освобождать память.

Просто используйте std::wstring и двигайтесь дальше. std::wstring t = L"Tony";. Он обрабатывает все детали, и вам не нужно беспокоиться об уборке.

6 голосов
/ 24 июня 2010

Поскольку вы являетесь разработчиком C #, я укажу на несколько вещей, которые c ++ делает по-другому.

Это выделяет новый wchar_t и присваивает его t

wchar_t* t = new wchar_t

Это массив константных символов

"Tony" 

Чтобы получить постоянный массив wchar_t, добавьте к нему префиксL

L"Tony"

Это переназначает t указывать на константу L "Tony" вместо вашего старого wchar_t и вызывает утечку памяти, поскольку ваш wchar_t никогда не будет освобожден.

t = L"Tony"

Thisсоздает строку широких символов (wchar_t) для хранения копии L "Tony"

std::wstring t = L"Tony"

Я думаю, что последняя строка - это то, что вы хотите.Если вам нужен доступ к указателю wchar_t, используйте t.c_str ().Обратите внимание, что строки c ++ являются изменяемыми и копируются при каждом присваивании.

Это можно сделать следующим образом:

const wchar_t* t = L"Tony"

Это не создает копию, а только назначает указатель, указывающий намассив const wchar

5 голосов
/ 24 июня 2010

Для этого сначала нужно назначить указатель для недавно выделенного wchar_t в t, а затем попытаться присвоить неполную строку в t.

Можно ли использовать std::wstringвместо?Это обеспечит все ваши потребности в управлении памятью.

0 голосов
/ 24 июня 2010

вы можете, просто "Tony" - это жестко закодированная строка, и они по умолчанию являются ANSI в большинстве редакторов / компиляторов.Если вы хотите сообщить редактору, что вы печатаете в строке Unicode, то добавьте к ней префикс L, например, t = L"Tony".

У вас есть другие проблемы с вашим кодом, ваше распределение выделяет один символ Unicode (2 байта), то вы пытаетесь указать исходную переменную на константную строку, таким образом, утечка этих 2 байтов.

Если вы хотите создать буфер данных Unicode и поместить в него данные, вы хотитеделать:

wchar_t* t = new wchar_t[500];
wcscpy(t, "Tony");
0 голосов
/ 24 июня 2010

это совершенно неправильно. Нет необходимости выделять два байта, заставлять t указывать на них, а затем перезаписывать указатель, т

Кроме того, «Тони» имеет другой тип. Использование:

wchar_t *t = L"Tony";

ИМХО лучше вообще не использовать wchars - см. https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...