新表达和删除表达对const引用和const指针(new-expression and delete

2019-10-18 18:42发布

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在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的版本int* constint* )产生的输出作为其更常量对应相同。 在全部5个的情况下,为何以及如何被临时新表达的寿命延长?

假设相应的操作员尚未超载,显式删除,或由非公有制如果数据类型是一个类或结构,没有标准作如下保证:

  • 反引用运营商提供的指针对象直接访问

  • new运营商产生的指针动态分配的内存,而不是原始动态分配的内存动态分配的副本

相反,如果new运营商超载,但仍返回::operator new(size)和引用操作超载,但仍然返回到对象的引用,是否有任何副作用,这将使这两个点不成立?

Answer 1:

常量性影响对象本身。 newdelete和构造影响对象的创建 。 它没有意义的问构造和析构函数是否为const ,因为他们之前或对象存在后运行。 同样,您可以创建和动态破坏常量对象,和/或可以通过不断的指针或引用管理动态创建的对象。

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

{
    const int x = 0;
}

这是行不通的,如果常量性可以防止物体x被破坏。



Answer 2:

在所有的例子“常量”只阻止你通过任务修改的变量。 这就是它。 它不会阻止删除回收内存。

在你的第一个例子,“const int的&cirDynamic”防止你写的东西,如“cirDynamic = 2”。 但它的法律采取cirDynamic的地址(这将让你“const int的*”指针),并删除将在const的指针操作愉快。

在第二个例子中,“const int的* const的cipcDynamic”时,第一常量防止您修改由指针指向的地点,例如“* cipcDynamic = 2”时,第二常量防止您修改指针本身指向另一个地方像 “cipcDynamic = INT新”。



文章来源: new-expression and delete-expression on const reference and const pointer