当我可以创建共享指针时,为什么我不能创建指向数组的唯一指针?
Why can't I make a unique pointer to an array, when I can make a shared pointer?
以下内容无效:
#include <memory>
#include <iostream>
typedef double zip[10];
int main()
{
std::unique_ptr<zip> s = std::make_unique<zip>();
(*s)[0] = 2.0;
std::cout << (*s)[0] << std::endl;
return 0;
}
但以下内容是完全有效的:
int main()
{
std::shared_ptr<zip> s = std::make_shared<zip>();
(*s)[0] = 2.0;
std::cout << (*s)[0] << std::endl;
return 0;
}
为什么会有这种差异?我错过了什么?
区别在于shared_ptr
可能指向也可能不指向数组。任何特定的shared_ptr<T>
实例都可能指向单个T
或一组T
。
相比之下,unique_ptr<T>
总是指向单个T
,而unique_ptr<T[]>
指向一个T
数组。它直接在类型本身中编码。因此,存储数组的版本具有适当的operator[]
重载,而另一个版本则没有。
还应该指出的是,shared_ptr::operator[]
是 C++17 的补充,unique_ptr<T[]>::operator[]
一直存在。
因为不允许在已知边界的数组上make_unique
。看为什么不允许使用"make_unique<T[N]>"?和 https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique
相关文章:
- 如何创建指针链?我想创建具有指向更多对象的指针的对象,该对象具有指针.这可能吗?
- c++ 获取非语法使用"&"创建指针
- 在自定义构造函数中的堆上创建指针
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 创建指针会占用大量资源吗?
- 创建指针时是否没有构造函数调用
- 以不寻常的方式创建指针
- 在类中创建指针到另一个对象
- Visual Studio 2015"非标准语法;使用"&"为成员创建指针"
- 创建指针 C++ 时获取段错误
- 当我在 c++ 中创建指针数组时无法读取的内存
- 创建指针列表的正确范例是什么
- 如何在C 11中创建指针映射以静态成员功能
- 奇怪的错误:当没有真正创建指针时,使用已删除的函数'std::unique_ptr<_Tp,_Dp>::unique_ptr
- 如何使用双指针创建指针数组?
- 创建指针数组
- C++:创建指针的副本
- 使用new创建指针数组,这样指针就不会初始化为NULL
- 如何在不从参数列表中创建对象的情况下创建指针
- 如何在定义后创建指针和结构实例