Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量引用和常量指针上的新建表达式和删除表达式_C++_New Operator_Delete Operator_Const Reference_Const Pointer - Fatal编程技术网

C++ 常量引用和常量指针上的新建表达式和删除表达式

C++ 常量引用和常量指针上的新建表达式和删除表达式,c++,new-operator,delete-operator,const-reference,const-pointer,C++,New Operator,Delete Operator,Const Reference,Const Pointer,C++ 许多文献说,const引用不能用来修改它们的引用对象,const指针不能用来修改它们的指针对象 那么,为什么它们可以被deleted const int& cirDynamic = *( new int(5) ); // ^ 'const int& cirDynamic = *( &( *( new int(5) ) ) );' gives same output below cout << cirDynamic << endl; // 5

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
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
输出显示至少有一些动态分配的内存被释放。是否所有内容都已释放,或者仅释放副本时是否会涉及复制

常量引用片段的非常量版本(
int&
)和常量指针常量片段的非前导常量版本(
int*const
int*
)产生的输出与它们的更多常量对应项相同。在所有5种情况下,为什么以及如何延长临时新表达式的生存期

如果数据类型为类或结构,则假定相应的运算符未被重载、显式删除或非公开,则标准是否提供以下保证:

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

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


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

在所有示例中,“const”只会阻止您通过赋值修改变量。这就是它的全部功能。它不会阻止删除以回收内存

在第一个示例中,“const int&cirDynamic”阻止您编写类似“cirDynamic=2”的内容。但获取cirDynamic的地址是合法的(这将得到一个“const int*”指针),delete将在const指针上运行


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

所有示例中的“const”仅阻止您通过赋值修改变量。这就是它的全部功能。它不会阻止删除以回收内存

在第一个示例中,“const int&cirDynamic”阻止您编写类似“cirDynamic=2”的内容。但获取cirDynamic的地址是合法的(这将得到一个“const int*”指针),delete将在const指针上运行


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

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

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

{
    const int x = 0;
}

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

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

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

{
    const int x = 0;
}

如果constness可以防止对象
x
被破坏,这就行不通了。

这需要解释哪一方面?是的,你需要更具体一点。你是在问为什么你首先看到一个
5
显示,然后看到一个垃圾值吗?@KerrekSB@NateKohl:编辑它,问如果指针和引用是
const
,为什么可以使用
delete
。这方面需要解释一下?是的,你需要更具体一点。您是否在问为什么首先看到显示的是
5
,然后看到的是垃圾值?@KerrekSB@NateKohl:编辑了它,并问如果指针和引用是
常量,为什么可以使用
delete