gpt4 book ai didi

c++ - 实现 unique_ptr : Deleting non-allocated objects

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:25 25 4
gpt4 key购买 nike

我的目标是实现一个简单版本的 unique_ptr,它只提供构造函数、析构函数、->、* 和 release()。

但是,我不知道在使用未分配指针初始化 unique_ptr 的情况下该怎么做。

例如

int i = 0;
unique_ptr<int> p{&i};

如果 unique_ptr 简单地在它拥有的指针上调用 delete,这将产生未定义(和不希望的)行为,至少据我所知。我能做些什么来防止这种情况发生?

编辑:我对这个问题的尝试如下......

template<typename T>
class Uptr
{
public:
Uptr<T>(T* pt) : mp_owned{pt} {}
~Uptr<T>() {delete mp_owned;}

Uptr<T>(const Uptr<T>&) = delete;
Uptr<T>& operator=(const Uptr<T>&) = delete;

T& operator*() const {return *mp_owned;}
T* operator->() const {return mp_owned;}

T* release() {return mp_owned;}

private:
T* mp_owned;
};

最佳答案

您无法以编程方式检查指针值是如何获得的。在您的情况下(这是大部分实际编程的高度代表!),解决方案是记录您的接口(interface)要求指针值是可删除的。您为用户设置了一个先决条件,这要求您的用户阅读文档并遵循它,而您没有也不能提供语言内方法来验证这些先决条件。您将负担转嫁给用户。

这种先决条件负担总是形成一种“技术债务”,您希望尽可能地避免它(但也许不会以运行时成本为代价)。例如,在标准库中,我们强烈反对使用 unique_ptr 的所有权获取构造函数,而是作为用户使用没有前提条件和结果的 make_unique在有效的 unique_ptr 值中。该设计是您在现实世界中如何管理技术债务的典范。

关于c++ - 实现 unique_ptr : Deleting non-allocated objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43312822/

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