указатель wchar_t

Что случилось с этим:

wchar_t * t = new wchar_t;

t = "Tony";

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

10
задан Tony The Lion 24 June 2010 в 17:33
поделиться

6 ответов

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

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

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

27
ответ дан 3 December 2019 в 13:27
поделиться

Поскольку вы разработчик 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

6
ответ дан 3 December 2019 в 13:27
поделиться

Это сначала назначает указатель на вновь выделенный wchar_t в t , а затем пытается назначить неширокую строку в t .

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

5
ответ дан 3 December 2019 в 13:27
поделиться

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

Кроме того, "Tony" имеет другой тип. Используйте:

wchar_t *t = L "Tony";

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

-1
ответ дан 3 December 2019 в 13:27
поделиться

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

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

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

wchar_t* t = new wchar_t[500];
wcscpy(t, "Tony");
0
ответ дан 3 December 2019 в 13:27
поделиться

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

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

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

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

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

11
ответ дан 3 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: