Что случилось с этим:
wchar_t * t = new wchar_t;
t = "Tony";
Я думал, что мог использовать wchar_t указатель в качестве строки...
В вашем коде есть две проблемы.
Во-первых, "Tony"
является указателем на строку из char
. L "Tony"
- это соответствующая широкая строка.
Во-вторых, вы выделяете один wchar_t
через new, а затем сразу же теряете его, переназначая указатель на Tony. Это приводит к утечке памяти.
Поскольку вы разработчик C #, я отмечу несколько отличий от C ++.
Это выделяет новый wchar_t и присваивает его t
wchar_t* t = new wchar_t
Это массив констант char
"Tony"
Чтобы получить постоянный массив wchar_t с префиксом L
L"Tony"
Это перенастраивает t, чтобы он указывал на константу L "Тони "вместо вашего старого wchar_t и вызывает утечку памяти, поскольку ваш wchar_t никогда не будет выпущен.
t = L"Tony"
Это создает строку широких символов (wchar_t) для хранения копии L "Tony"
std::wstring t = L"Tony"
Я думаю, что последняя строка - это то, что вам нужно. Если вам нужен доступ к указателю wchar_t, используйте t.c_str (). Обратите внимание, что строки C ++ изменчивы и копируются при каждом назначении.
C способ сделать это:
const wchar_t* t = L"Tony"
Это не создает копию, а только назначает указатель, указывающий на массив const wchar
Это сначала назначает указатель на вновь выделенный wchar_t
в t
, а затем пытается назначить неширокую строку в t
.
Можете ли вы использовать вместо него std :: wstring
? Это удовлетворит все ваши потребности в управлении памятью.
это совершенно неверно. Нет необходимости выделять два байта, делать t указателем на них, а затем перезаписывать указатель t, навсегда теряя память.
Кроме того, "Tony" имеет другой тип. Используйте:
wchar_t *t = L "Tony";
ИМХО лучше вообще не использовать wchars - См. https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful
вы можете, просто «Tony» - это жестко запрограммированная строка, и они по умолчанию ANSI в большинстве редакторов / компиляторов. Если вы хотите сообщить редактору, что вы вводите строку Unicode, добавьте к ней префикс L, например t = L "Тони"
.
У вас есть другие проблемы с вашим кодом, ваше выделение выделяет один символ Unicode (2 байта), затем вы пытаетесь указать исходную переменную на постоянную строку, тем самым теряя эти 2 байта.
Если вы хотите создать буфер данных Unicode и поместить в него данные, вам нужно сделать:
wchar_t* t = new wchar_t[500];
wcscpy(t, "Tony");
Указатель просто указывает на одно значение. Это важно.
Все, что вы сделали, - это выделение места для одного wchar_t
и наведите на него курсор. Затем вы пытаетесь установить указатель так, чтобы он указывал на строку (помните, только на первый символ), но тип строки неверен.
У вас есть строка char
, она «должна» быть L «Tony»
. Но все, что вы здесь делаете, это утечка вашего предыдущего распределения памяти, потому что указатель содержит новое значение.
Скорее вы хотите выделить достаточно места для хранения всей строки, а затем скопируйте строку в эту выделенную память. Однако это ужасная практика; никогда не делайте ничего, что заставляет вас явно освобождать память.
Просто используйте std :: wstring
и двигайтесь дальше. std :: wstring t = L "Тони";
. Он обрабатывает все детали, и вам не нужно беспокоиться о том, чтобы что-либо очистить.