const引用和const指针上的new-expression和delete-expression

时间:2013-10-11 21:48:44

标签: c++ new-operator delete-operator const-reference const-pointer

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* constint*)的非领先const版本产生相同的输出作为更多const对应物。在所有5个案例中,为什么以及如何延长临时new-expression的生命周期?

如果数据类型是类或结构,假设相应的运算符没有被重载,显式删除或非公共运算符,那么标准是否做出以下保证:

  • 取消引用运算符提供对指针对象的直接访问

  • new运算符生成指向动态分配内存的指针,而不是动态分配的原始动态分配内存副本

如果new运算符被重载但仍然返回::operator new(size)并且解除引用运算符被重载但仍然返回对该对象的引用,是否有任何副作用会使这两个点不持有?

2 个答案:

答案 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影响对象本身。 newdelete以及构造函数会影响对象的创建。询问构造函数或析构函数是否为const是没有意义的,因为它们在对象存在之前或之后运行。类似地,您可以动态创建和销毁常量对象,和/或您可以通过常量指针或引用来管理动态创建的对象。

作为一个非常简单的思考实验,请考虑以下代码:

{
    const int x = 0;
}

如果constness可以阻止对象x被破坏,那么这不会起作用。