在C++中,可以在堆上分配const对象:
const Class* object = new const Class();
const_cast<Class*>( object )->NonConstMethod(); // UB
Run Code Online (Sandbox Code Playgroud)
因此,写入对象的尝试将是UB.
我不知道这样的对象将如何与未声明的堆分配对象不同const:
const Class* object = new Class();
Run Code Online (Sandbox Code Playgroud)
我的意思是当我在堆栈上分配一个对象时,它会转到自动存储,这是特定于实现的,所以可能有一些特定const于实现的方法允许以某种特殊方式分配对象,当我写入对象时会产生UB.
然而,每当我使用new编译器时,都需要发出operator new()函数调用,并且该函数不可能做任何不同的事情 - 它只是以统一的方式分配内存,无论const我的代码中是否存在.
一个是如何const堆上分配的对象从非不同的const一个,如何是不确定的行为可能的,如果我尝试修改呢?
c++ memory-management const const-correctness undefined-behavior
在C++中,我有一个只需要对数组进行只读访问但是被错误地声明为接收非const指针的函数:
size_t countZeroes( int* array, size_t count )
{
size_t result = 0;
for( size_t i = 0; i < count; i++ ) {
if( array[i] == 0 ) {
++result;
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我需要为const数组调用它:
static const int Array[] = { 10, 20, 0, 2};
countZeroes( const_cast<int*>( Array ), sizeof( Array ) / sizeof( Array[0] ) );
Run Code Online (Sandbox Code Playgroud)
这将是未定义的行为吗?如果是这样 - 程序何时会运行到UB中 - 在执行const_cast并调用functon或访问数组时?
例如:
const int* pc = new const int(3); // note the const
int* p = const_cast<int*>(pc);
*p = 4; // undefined behavior?
Run Code Online (Sandbox Code Playgroud)
特别是,编译器能否优化掉堆分配的堆*pc?
如果没有,修改,试图*pc通过p仍然构成未定义的行为-如果是这样,为什么呢?
c++ heap-memory const-cast compiler-optimization undefined-behavior
我创建了一个const指针,该指针指向动态分配的abject实例。我无法理解对象本身是否是const。
首先,我试图通过使用指针来调用非常量成员函数,这正如预期的那样会导致编译错误,因为(这是我的解释,不知道它是否为真)该成员函数创建的指针被分配给了该const指针。它没有产生任何东西。
其次,我尝试取消引用指针并调用该非const成员函数。我认为成员函数现在创建的this指针将不再是const指针,因为compile无法知道p(即*p)返回的对象是否由const指针返回。原来我错了。
成员函数如何理解这一点?
#include<iostream>
class A
{
int a=4;
public:
A()
{}
void print()
{
std::cout<<a<<std::endl;
}
};
int main()
{
const A* p = new A();
p->print(); //1 causes compile error
(*p).print(); //2 causes compile error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为标记为2的行不会产生编译错误。它会导致编译错误。错误消息是:
Run Code Online (Sandbox Code Playgroud)"a.cpp: In function ‘int main()’: a.cpp:21:13: error: passing ‘const A’ as ‘this’ argument discards qualifiers [-fpermissive] p->print(); //1 causes compile error ^ a.cpp:10:9: note: in call to ‘void A::print()’ void print() ^~~~~ a.cpp:22:15: error: …