Joã*_*ulo 0 c++ pointers const undefined-behavior
当指针的数据为const时,更改指针指向的位置是否为未定义行为?例:
const char* p = "foo";
p = "boo";
Run Code Online (Sandbox Code Playgroud)
我相信这不是UB,因为指针本身不是const,并且我没有修改该"foo"
对象。
额外的问题:并更改不是const指针的const数据?会UB吗?例:
char* const p = "foo";
(*(char**)&p) = (char*)malloc(strlen(p));
Run Code Online (Sandbox Code Playgroud)
我相信这不是UB,因为指针本身不是const,并且我没有修改“ foo”对象。
这是对的。指针不是,const
因此您可以根据需要将其更改为指向其他对象。在这种情况下,它不会导致内存泄漏,但请记住,如果指针指向随分配的数据,new
并且它是指向该数据的唯一指针,则需要delete
在重新分配指针之前先调用它,否则会出现内存泄漏。
额外的问题:并删除指针的常量性?会UB吗?
如果您尝试修改const
从中删除的对象,则只有UB const
,在这种情况下,您要这样做。只是删除const
是可以的,有时是需要的,但是除非您不const
以该对象为准,否则永远不允许您修改该对象。例如,以下是合法的,因为foo
不是const
。
int foo = 42;
void bar(int const& baz) { const_cast<int&>(baz) = 21; }
int main()
{
bar(foo);
}
Run Code Online (Sandbox Code Playgroud)
另一方面
const int foo = 42;
void bar(int const& baz) { const_cast<int&>(baz) = 21; }
int main()
{
bar(foo);
}
Run Code Online (Sandbox Code Playgroud)
是不合法foo
的const