【发布时间】:2017-04-09 22:59:35
【问题描述】:
我的目标是实现一个简单版本的 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;
};
【问题讨论】:
-
real
unique_ptr也是如此。但是要回答你的具体问题 - 你不能做任何事情,可靠/便携(至少不是我上次熟悉 C++)。 -
你可以有一个标志来控制你是否调用 delete,并在堆栈分配的对象上创建 unique_ptr 时设置它。它当然会问为什么你首先要创建 unique_ptrs 来堆叠分配的对象
-
这没有意义。
unique_ptr的意义在于它是资源的唯一所有者。如果stack拥有它,那么unique_ptr不应指向它。 -
@Galik “没有意义”不是不彻底的借口。
标签: c++ pointers unique-ptr