有没有办法在数组上遍历shared_或任何"smart" ptr?
Is there a way to traverse shared_ or any "smart" ptr over an array?
据我所知,智能指针应该与"原始"指针相等,不同之处在于它是安全的。好的,但如果我有常规指针:
int* p = new int[10];
fill(p, p + 10, 0);//this will work for regular pointer but not for smart one.
与手写循环相同:
for(int i = 0; i < 10; ++i)
{
*p[i] = 0;
}
这对聪明的创业者来说是不可能的。所以问题是,我如何初始化我存储在其中一个智能指针中的指针的数组(假设为shared_ptr)?
首先,使用std::vector<int>
可能更容易。不过,如果您的数组大小不变,那么std::vector<int>
确实可以用智能指针来代替。
这样一来,您的第一选择应该是std::unique_ptr
,特别是数组专用化:std::unique_ptr<int[]>
。(如果不这样做,智能指针将在指针上使用delete
而不是delete[]
,从而导致未定义的行为。)您的代码将变为:
std::unique_ptr<int[]> p(new int[10]);
std::fill(p.get(), p.get() + 10, 0);
正如您所看到的,智能指针有一个返回底层指针的get()
方法。
从这里开始,如果你需要使用std::shared_ptr
,事情就会变得非常危险(据我所知,要注意不幸的疏忽)。这种疏忽是std::shared_ptr
没有阵列专业化:
{
std::shared_ptr<int> x(new int[10]);
} // oops! calls delete x.get(); instead of delete [] x.get(); ... UB!
然而,std::shared_ptr
可以很容易地纠正这种情况,比如:
{
std::shared_ptr<int> x(new int[10], std::default_delete<int[]>());
} // correctly uses delete [] x.get()
从这一点来看,代码是相同的:
std::shared_ptr<int> p(new int[10], std::default_delete<int[]>());
std::fill(p.get(), p.get() + 10, 0);
请注意,std::shared_ptr
提供了一个从std::unique_ptr
构造的构造函数,该构造函数正确地使用了deleter。所以这是安全的:
std::unique_ptr<int[]> p(new int[10]);
std::shared_ptr<int> p2(std::move(p)); // okay, uses std::default_delete<int[]>()
假设您使用如下智能指针声明数组:
boost::shared_array<int> p = new int[10];
对fill
-函数的调用将如下所示:
fill(p.get(), p.get() + 10, 0);
p.get()
返回由智能指针管理的原始指针。你的循环不需要调整,但它首先是错误的:
for(int i = 0; i < 10; ++i) {
p[i] = 0; // no dereferencing required here
}
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C++ 将 CIN 值存储到任何类型的数组中
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- GStreamer在开始任何播放之前进行搜索
- 有没有办法在数组上遍历shared_或任何"smart" ptr?