c++ - const 引用和 const 指针上的 new 表达式和 delete 表达式

标签 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
delete &cirDynamic;
cout << cirDynamic << endl; // garbage value

我知道 T* const 中的尾随 const 只会防止指针被重新定位,但下面我使用了两个 const,如 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 引用片段的非 const 版本 (int&) 和 const 指针 const 片段的非前导 const 版本 (int* constint*) 产生与其更多 const 对应物相同的输出。在所有 5 种情况下,为什么以及如何延长临时 new 表达式的生命周期?

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

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

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

如果 new 运算符被重载但仍返回 ::operator new(size) 并且解引用运算符被重载但仍返回对象的引用,则有什么副作用会使这两点不成立吗?

最佳答案

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

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

{
    const int x = 0;
}

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

关于c++ - const 引用和 const 指针上的 new 表达式和 delete 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19327785/

相关文章:

c++ - 删除父类时,方法局部静态变量会发生什么情况?

c++ - x86/C++ - 指向指针 : Const being violated by compiler? 的指针

C++填充双端队列错误分配

c++ - atldbsch.h 中的 BSTR 内存泄漏 - 怎么办?

java - GWT.create() 是否总是在浏览器内存中创建一个新对象?

database - 全新的应用程序如何向下兼容客户旧的本地数据库?

c++ - 我是否需要释放使用 'new' 时分配的 wchar 内存,或者 delete[] 是否也释放它?

c++ - 如果 new 运算符失败,是否可以将指针设置为 null?

c++ - 为什么 C++ 运算符 new/delete/variants 不应该在头文件中?

c++ - itoa 会删除字符吗?