C ++
许多文献都说const
引用不能用于修改它们的指示物,const
指针不能用来修改它们的指针。
然后,为什么他们可以delete
d?
const int& cirDynamic = *( new int(5) );
// ^ 'const int& cirDynamic = *( &( *( new int(5) ) ) );' gives same output below
cout << cirDynamic << endl; // 5
delete &cirDynamic;
cout << cirDynamic << endl; // garbage value
我知道T* const
中的尾随const只会阻止指针被重置,但在下面我使用两个const
s,如const T* const
中所示,以强调。为什么以下指针可以是delete
d?
const int* const cipcDynamic = new int(5);
// ^ 'const int* const cipcDynamic = &( *( new int(5) ) );' gives same output below
cout << *cipcDynamic << endl; // 5
delete cipcDynamic;
cout << *cipcDynamic << endl; // garbage value
输出显示至少释放了一些动态分配的内存。是否所有这些都已被释放,或者是否只有副本被释放时才会被复制?
const参考片段(int&
)的非const版本和const指针const片段(int* const
和int*
)的非领先const版本产生相同的输出作为更多const对应物。在所有5个案例中,为什么以及如何延长临时new-expression的生命周期?
如果数据类型是类或结构,假设相应的运算符没有被重载,显式删除或非公共运算符,那么标准是否做出以下保证:
取消引用运算符提供对指针对象的直接访问
new
运算符生成指向动态分配内存的指针,而不是动态分配的原始动态分配内存副本
如果new
运算符被重载但仍然返回::operator new(size)
并且解除引用运算符被重载但仍然返回对该对象的引用,是否有任何副作用会使这两个点不持有?
答案 0 :(得分:2)
'const'仅阻止您通过赋值修改变量。就是这样。它不会阻止删除回收内存。
在您的第一个示例中,“const int&amp; cirDynamic”阻止您编写类似“cirDynamic = 2”的内容。但是获取cirDynamic的地址是合法的(它会给你一个“const int *”指针),而删除会很快地对const指针进行操作。
在你的第二个例子中,“const int * const cipcDynamic”,第一个const阻止你修改指针指向的位置,比如“* cipcDynamic = 2”,第二个const阻止你修改指针本身到点到另一个地方,比如“cipcDynamic = new int”。
答案 1 :(得分:2)
Constness影响对象本身。 new
和delete
以及构造函数会影响对象的创建。询问构造函数或析构函数是否为const
是没有意义的,因为它们在对象存在之前或之后运行。类似地,您可以动态创建和销毁常量对象,和/或您可以通过常量指针或引用来管理动态创建的对象。
作为一个非常简单的思考实验,请考虑以下代码:
{
const int x = 0;
}
如果constness可以阻止对象x
被破坏,那么这不会起作用。