首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以遍历数组上的shared_或任何“智能”ptr?

有没有一种方法可以遍历数组上的shared_或任何“智能”ptr?
EN

Stack Overflow用户
提问于 2012-01-26 16:35:10
回答 2查看 415关注 0票数 1

据我所知,智能指针应该等同于“原始”指针,区别在于它是安全的。好的,但是如果我有普通的指针:

代码语言:javascript
复制
int* p = new int[10];
fill(p, p + 10, 0);//this will work for regular pointer but not for smart one.  

与手写循环相同:

代码语言:javascript
复制
for(int i = 0; i < 10; ++i)
{
*p[i] = 0;
}

这对于聪明的指针来说是不可能的(我认为)。所以问题是,我如何初始化存储在智能指针(假设是shared_ptr)中的指针的数组?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-26 16:45:57

首先,只使用std::vector<int>可能会更简单。但是,如果您的数组具有不变的大小,那么也许用智能指针替换std::vector<int>确实更好。

因此,您的第一选择应该是std::unique_ptr,具体地说就是数组专门化:std::unique_ptr<int[]>。(如果不这样做,智能指针将在指针上使用delete而不是delete[],从而导致未定义的行为。)你的代码将变成:

代码语言:javascript
复制
std::unique_ptr<int[]> p(new int[10]);
std::fill(p.get(), p.get() + 10, 0);

正如您所看到的,智能指针有一个返回底层指针的get()方法。

从这里开始,如果你需要使用std::shared_ptr,事情就会变得非常危险(据我所知,这会造成不幸的疏忽)。这个疏忽是因为std::shared_ptr没有数组专门化:

代码语言:javascript
复制
{
    std::shared_ptr<int> x(new int[10]);
} // oops! calls delete x.get(); instead of delete [] x.get(); ... UB!

但是,std::shared_ptr可以像这样轻松地纠正这一点:

代码语言:javascript
复制
{
    std::shared_ptr<int> x(new int[10], std::default_delete<int[]>());
} // correctly uses delete [] x.get()

从这一点来看,代码是相同的:

代码语言:javascript
复制
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。所以这是安全的:

代码语言:javascript
复制
std::unique_ptr<int[]> p(new int[10]);
std::shared_ptr<int> p2(std::move(p)); // okay, uses std::default_delete<int[]>()
票数 3
EN

Stack Overflow用户

发布于 2012-01-26 16:41:51

假设使用智能指针声明数组,如下所示:

代码语言:javascript
复制
boost::shared_array<int> p = new int[10];

fill-function的调用将如下所示:

代码语言:javascript
复制
fill(p.get(), p.get() + 10, 0);

p.get()返回由智能指针管理的原始指针。您的循环不需要调整,但它首先是错误的:

代码语言:javascript
复制
for(int i = 0; i < 10; ++i) {
    p[i] = 0; // no dereferencing required here
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9015528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档