据我所知,智能指针应该等同于“原始”指针,区别在于它是安全的。好的,但是如果我有普通的指针:
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)中的指针的数组?
发布于 2012-01-26 16:45:57
首先,只使用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[]>()发布于 2012-01-26 16:41:51
假设使用智能指针声明数组,如下所示:
boost::shared_array<int> p = new int[10];对fill-function的调用将如下所示:
fill(p.get(), p.get() + 10, 0);p.get()返回由智能指针管理的原始指针。您的循环不需要调整,但它首先是错误的:
for(int i = 0; i < 10; ++i) {
p[i] = 0; // no dereferencing required here
}https://stackoverflow.com/questions/9015528
复制相似问题