Правильно ли я указываю PCWSTR на строковый литерал?

Я немного устал от C ++, поэтому я ищу помощь с вопросом о указателе строки.

Во-первых, давайте рассмотрим некоторые основы указателя с целым числом:

void SetBob(int* pBob)
{
*pBob = 5;
}

int main(int argc, _TCHAR* argv[])
{
int bob = 0;
SetBob(&bob);
}

При запуске main () создает целое число и передает его адрес SetBob. В SetBob значение (по адресу, на который указывает pBob) установлено на 5. Когда SetBob возвращается, bob имеет значение 5.

Теперь давайте рассмотрим строковую константу:

typedef wchar_t WCHAR;
typedef const WCHAR *PCWSTR;

void SetBob(PCWSTR* bob)
{
*bob = L"Done";
}

int main(int argc, _TCHAR* argv[])
{
PCWSTR bob = L"";
SetBob(&bob);
}

При запуске main () создает PCWSTR, указывающий на пустую строку, и передает его адрес SetBob. В SetBob указатель PCWSTR теперь указывает на строку Done. Когда SetBob возвращается, bob имеет значение «Done».

Мои вопросы:

  1. В отладчике я вижу, что строка bob устанавливается в Done после вызова SetBob. Но почему это работает? В примере с целыми числами я выделил пространство для целого числа, поэтому имеет смысл хранить значение в этом пространстве. Но в строковом примере PCWSTR — просто указатель. Идея в том, что строковые константы тоже находятся в памяти, поэтому я просто указываю на эту константу?
  2. Поскольку литерал «Done» находится в SetBob, нужно ли беспокоиться, что, несмотря на указание на него, память для «Done» может быть восстановлена? Например, если бы я создал буфер WCHAR, я бы скопировал «Готово» в буфер, чтобы меня это не волновало. Но поскольку я указываю на литерал внутри функции, может ли этот литерал быть уничтожен в какой-то момент после завершения функции, оставляя Бобу неожиданно ничего не указывая?

1

Решение

  1. Для вопроса 1 вы просто даете себе правильный ответ.

  2. А для вопроса 2 это похоже на вопрос 1. Вы видите, что в SetBob программа выделяет (вы можете считать это точно так же, как «malloc») пространство для строки «Done», затем устанавливаете указатель bob на адрес строка. Таким образом, на этом этапе память, принадлежащая строке, помечается как «используемая», поэтому даже когда дело доходит до конца функции, она никогда не будет уничтожена. Только когда вы используете «бесплатно», это всегда будет в вашей памяти.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]