相关疑难解决方法(0)

堆分配的const对象与非const对象有何不同?

在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

11
推荐指数
2
解决办法
556
查看次数

是否使用const_cast对只允许的const对象进行只读访问?

在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或访问数组时?

c++ casting const const-cast undefined-behavior

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

是尝试修改const_cast-ed,但动态分配的常量对象仍然是未定义的行为?

例如:

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

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

成员函数如何理解通过取消引用const指针获得对象?

我创建了一个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的行不会产生编译错误。它会导致编译错误。错误消息是:

"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: …
Run Code Online (Sandbox Code Playgroud)

c++ pointers const class

2
推荐指数
1
解决办法
80
查看次数