gpt4 book ai didi

c++ - 当我不知道 `std::unique_ptr(ptr)` 是如何分配的时, `ptr` 的销毁策略?

转载 作者:行者123 更新时间:2023-11-30 01:10:09 24 4
gpt4 key购买 nike

另一个“现代 C++”初学者问题。我似乎对如何正确使用智能指针/智能指针销毁策略有一些误解。

struct Base {
virtual Base* clone() const = 0;
virtual ~Base() { }
};

void clone_and_use(const Base &original) {
auto clone = std::unique_ptr<Base>(original.clone());
… // do something with `clone`
}

据我所知,什么时候 clone超出范围,指向的内存将是 delete感谢 std::default_delete<Base> std::unique_ptr<Base> 使用的销毁策略(这似乎等同于 std::unique_ptr<Base, std::default_delete<Base>> )。

如果 original.clone() 会怎样返回一个指向内存的指针,该内存new 分配?显然是标准std::default_delete<Base>销毁政策不合适— delete只能与 new 一起使用, 但不是 new[] , malloc ,或其他任何东西——我应该在创建 clone 时指定不同的销毁策略。智能指针……但我会指定哪一个?

    auto clone = std::unique_ptr<Base, ?>(original.clone());
// ^

我猜我必须延长 Base这样我就可以简单地要求任何派生类型提供适合其 clone() 的销毁策略实现,但我不确定我将如何做到这一点。

谁能告诉我如何:

  • 定义Base接口(interface),使其可以支持 clone()不会导致泄漏或错误释放内存的方法;和
  • 如何正确使用智能指针销毁策略(如果在此示例中有必要)?

最佳答案

您的clone() 应该适本地返回一个智能指针,即

virtual std::unique_ptr<Base> clone() {
...
}

这避免了所有歧义。

关于c++ - 当我不知道 `std::unique_ptr<Base>(ptr)` 是如何分配的时, `ptr` 的销毁策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38745801/

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