gpt4 book ai didi

c++ - 在这种情况下如何使用 auto_ptr

转载 作者:行者123 更新时间:2023-11-30 02:42:31 24 4
gpt4 key购买 nike

我有以下代码:

void do_something(Image *image)
{

Image *smoothed = NULL;
Image *processed = NULL;
if (condition_met) {
smoothed = smooth(image);
processed = smoothed;
}
else {
processed = image;
}

...
delete smoothed_image
}

我想知道我是否可以执行以下操作,这是否是正确的方法。我对从 auto_ptr 对象设置另一个指针以及这是否会以某种方式改变所有权感到困惑。

void do_something(Image *image)
{
auto_ptr<Image *> smoothed;
Image *processed = NULL;

if (condition_met) {
smoothed = smooth(image); // This should own the pointer returned by smooth
processed = smoothed; // Is this OK? processed is not an auto_ptr
}
else {
processed = image;
}

...
// Destructor for the 'smoothed' variable should be called.
// The 'image' variable is not deleted.
}

析构函数会按照我的预期被调用吗?这是执行此操作的正确方法吗?

最佳答案

有几点要说明。假设平滑函数的签名是

Image* smooth(Image*);

那么您的代码至少需要更改为

void do_something(Image *image)
{
auto_ptr<Image> smoothed;
Image *processed = NULL;

if (condition_met) {
smoothed.reset(smooth(image)); // This should own the pointer returned by smooth
processed = smoothed.get(); // Maybe? Depends on what you're doing
}
else {
processed = image;
}

在某些情况下,像上面的 smoothed.get() 所做的那样,将原始指针从智能指针中拉出来是合理的,但你必须理解 < strong>smoothed 将在函数结束时被删除,即使你已经用原始指针做了其他事情。这里没有足够的信息来判断这是否是一个问题,但它是一种气味。

std::auto_ptr 现已弃用,取而代之的是 std::unique_ptr。主要原因是 auto_ptr 内容的移动方式:

std::auto_ptr<int> a = new int(5);
std::auto_ptr<int> b = a; // Copy? No!

在这段代码中,a 持有的指针已被转移到 b。 a 不再持有任何东西。这与我们通常认为的复制行为背道而驰,因此很容易搞砸。

C++11 引入了右值引用的概念(网络上有大量文章对此进行解释,包括 What are move semantics? )。拥有右值引用允许 unique_ptr 防止数据被移动到没有意义的地方。

std::unique_ptr<int> a = new(5);
std::unique_ptr<int> b = a; // Compile fail. Not copyable
std::unique_ptr<int> c = std::move(a); // OK, shows intent

有了这个,就可以将您的 smooth() 函数签名更新为

std::unique_ptr<Image> smooth(Image*) {
...
return newImage;
}

这清楚地指示调用者他们应该取得返回指针的所有权。现在你可以说

unique_ptr<Image> smoothed;
...
smoothed = smooth(image);

因为从函数返回的值是右值(尚未绑定(bind)到变量),指针被安全地移动到平滑

最后,是的,使用智能指针比调用delete 更可取。仔细考虑您的设计并尝试弄清楚指针所有权。

关于c++ - 在这种情况下如何使用 auto_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27016117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com