当原始数据为const时,是否要修改指针指向的UB?

时间:2019-09-30 14:38:17

标签: c++ pointers const undefined-behavior

在指针的数据为const时更改指针指向的位置是否是未定义的行为?示例:

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

我认为这不是UB,因为指针本身不是const,并且我不会修改"foo"对象。

额外的问题:并且不更改const指针的const数据吗?会UB吗?示例:

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

2 个答案:

答案 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限定的(字符串字面量是),则删除常量后就不能修改对象。