相关疑难解决方法(0)

可以在其范围之外访问局部变量的内存吗?

我有以下代码.

#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++ memory-management local-variables dangling-pointer

990
推荐指数
19
解决办法
26万
查看次数

堆分配的对象可以在C++中是const吗?

在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-correctness undefined-behavior

19
推荐指数
2
解决办法
4057
查看次数

为什么在抛弃指向该对象的指针而不是UB后写入非const对象?

根据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)

它将是未定义的行为.

编译器应该如何遵守这些要求?如果不使后者工作,它应该如何使前者工作?

c++ const const-correctness const-cast undefined-behavior

6
推荐指数
1
解决办法
694
查看次数