Это UB, чтобы изменить, где указатель указывает, когда исходные данные постоянны? - PullRequest
0 голосов
/ 30 сентября 2019

Было бы неопределенным поведением изменить, куда указывает указатель, когда его данные постоянны? Пример:

const char* p = "foo";
p = "boo";

Я считаю, что это не UB, потому что сам указатель не является константой, и я не изменяю объект "foo".

Дополнительный вопрос: и изменение неконстантные данные константного указателя? Будет ли UB? Пример:

char* const p = "foo";
(*(char**)&p) = (char*)malloc(strlen(p));

Ответы [ 2 ]

5 голосов
/ 30 сентября 2019

Я считаю, что это не UB, потому что сам указатель не является константой, и я не изменяю объект "foo".

Это правильно. Указатель не const, поэтому вы можете изменить его так, чтобы он указывал на что-то другое, если хотите. В этом случае это не приведет к утечке памяти, но помните, что если указатель указывает на данные, выделенные с помощью new, и это единственный указатель на эти данные, то вам нужно вызвать delete перед переназначением указателя, иначеесть утечка памяти.

Дополнительный вопрос: а удаление констант указателя? Будет UB?

Это только UB, если вы попытаетесь изменить объект const, из которого вы удалили const, что вы и делаете в этом случае. Простое удаление const хорошо, а иногда и необходимо, но вам никогда не разрешено изменять объект, если это не было const с самого начала. Например, следующее допустимо, поскольку foo не является const.

int foo = 42;

void bar(int const& baz) { const_cast<int&>(baz) = 21; }

int main()
{
    bar(foo);
}

, с другой стороны

const int foo = 42;

void bar(int const& baz) { const_cast<int&>(baz) = 21; }

int main()
{
    bar(foo);
}

не разрешено, поскольку foo является const

2 голосов
/ 30 сентября 2019

Код в первом фрагменте правилен на 100%. У вас есть указатель на const p, который вы назначаете на что-то другое. Все хорошо и в отличном состоянии.

Второй кусок кода не сформирован. Вы не можете изменить объект после удаления константности, если исходный объект был константно квалифицирован (какой строковый литерал).

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