我有以下代码.
#include <iostream>
int * foo()
{
int a = 5;
return &a;
}
int main()
{
int* p = foo();
std::cout << *p;
*p = 8;
std::cout << *p;
}
Run Code Online (Sandbox Code Playgroud)
而代码只是运行而没有运行时异常!
输出是 58
怎么会这样?本地变量的内存不能在其功能之外无法访问吗?
在C++中,可以声明堆栈分配的对象const:
const Class object;
Run Code Online (Sandbox Code Playgroud)
之后尝试在这样的对象上调用非const方法是未定义的行为:
const_cast<Class*>( &object )->NonConstMethod(); //UB
Run Code Online (Sandbox Code Playgroud)
堆分配的对象可以const具有相同的后果吗?我的意思是有可能是以下几点:
const Class* object = new Class();
const_cast<Class*>( object )->NonConstMethod(); // can this be UB?
Run Code Online (Sandbox Code Playgroud)
还是未定义的行为?
根据C++标准,const如果对象const本身不是,那么抛弃指针并写入对象是可以的.这样:
const Type* object = new Type();
const_cast<Type*>( object )->Modify();
Run Code Online (Sandbox Code Playgroud)
没关系,但这个:
const Type object;
const_cast<Type*>( &object )->Modify();
Run Code Online (Sandbox Code Playgroud)
是UB.
原因在于,当对象本身是const允许编译器优化对它的访问时,例如,不执行重复读取,因为重复读取对于不改变的对象没有意义.
问题是编译器如何知道实际上是哪些对象const?例如,我有一个功能:
void function( const Type* object )
{
const_cast<Type*>( object )->Modify();
}
Run Code Online (Sandbox Code Playgroud)
并将其编译为静态库,编译器不知道它将被调用的对象.
现在调用代码可以这样做:
Type* object = new Type();
function( object );
Run Code Online (Sandbox Code Playgroud)
它会很好,或者它可以做到这一点:
const Type object;
function( &object );
Run Code Online (Sandbox Code Playgroud)
它将是未定义的行为.
编译器应该如何遵守这些要求?如果不使后者工作,它应该如何使前者工作?