0

C++

许多文献说const引用不能用来修改它们的所指对象,const指针不能用来修改它们的指针。

那么,为什么他们可以是deleted?

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

我知道后面的 const inT* const只会防止指针被重新定位,但在下面我使用两个consts,如 in const T* const,以强调。为什么后面的指针可以是deleted?

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 片段 ( ) 的非前导 const 版本int* const ) 的非 const 版本和 const 指针 const 片段 ( andint*产生与其更多 const 对应物相同的输出。在所有 5 种情况下,为什么以及如何延长临时 new-expression 的生命周期?

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

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

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

相反,如果new运算符重载但仍返回::operator new(size),而解引用运算符重载但仍返回对对象的引用,是否有任何副作用会使这两点不成立?

4

2 回答 2

2

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

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

{
    const int x = 0;
}

x如果 constness 可以防止对象被破坏,这将不起作用。

于 2013-10-11T22:23:20.700 回答
2

所有示例中的 'const' 只会阻止您通过赋值修改变量。这就是它所做的一切。它不会阻止删除以回收内存。

在您的第一个示例中,“const int& cirDynamic”会阻止您编写类似“cirDynamic=2”的内容。但是获取 cirDynamic 的地址是合法的(这将为您提供一个“const int*”指针),并且 delete 将愉快地对 const 指针进行操作。

在您的第二个示例“const int* const cipcDynamic”中,第一个 const 阻止您修改指针指向的位置,例如“*cipcDynamic = 2”,第二个 const 阻止您修改指针本身以指向另一个地方,例如“cipcDynamic = new int”。

于 2013-10-11T22:16:59.360 回答