在指针的数据为const时更改指针指向的位置是否是未定义的行为?示例:
const char* p = "foo";
p = "boo";
我认为这不是UB,因为指针本身不是const,并且我不会修改"foo"
对象。
额外的问题:并且不更改const指针的const数据吗?会UB吗?示例:
char* const p = "foo";
(*(char**)&p) = (char*)malloc(strlen(p));
答案 0 :(得分:5)
我认为这不是UB,因为指针本身不是const,并且我不会修改“ foo”对象。
这是正确的。指针不是const
,因此您可以根据需要将其更改为指向其他对象。在这种情况下,它不会导致内存泄漏,但请记住,如果指针指向用new
分配的数据,并且它是指向该数据的唯一指针,则需要在重新分配指针之前调用delete
否则你会记忆犹新。
额外的问题:并删除指针的常量性?会是UB吗?
如果您尝试修改从中删除了const
的{{1}}对象,则只有UB,在这种情况下,您就是这样做的。只需删除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
答案 1 :(得分:2)
第一个代码段中的代码是100%正确的。您有一个指向常量p
的指针,该指针指向其他内容。一切都很好,处于薄荷状态。
第二段代码格式错误。如果原始对象是const限定的(字符串字面量是),则删除常量后就不能修改对象。