gpt4 book ai didi

c++ - 为什么我的 UniquePtr 实现会重复释放?

转载 作者:行者123 更新时间:2023-12-02 15:49:57 24 4
gpt4 key购买 nike

当我运行这个程序时,我得到了双倍的自由来实现唯一的 ptr。知道为什么会这样吗?

#include <iostream>
#include <memory>
using namespace std;

template <class T>
class UniquePtr
{
public:
UniquePtr(T* t = nullptr) : t_(t) {}
UniquePtr(const UniquePtr&) = delete;
UniquePtr& operator=(const UniquePtr& oth) = delete;
UniquePtr(UniquePtr&& oth) {
std::swap(t_, oth.t_);
}
UniquePtr& operator=(UniquePtr&& oth) {
std::swap(t_, oth.t_);
return *this;
};
~UniquePtr() {
delete t_;
}

private:
T* t_;
};

struct Obj {
Obj(int x): x_(x) { cout << "new " << x_ << endl; }
~Obj() { cout << "delete " << x_ << endl; }
int x_;
};


template <class UP>
void test(UP&&) {
{
UP ptr(new Obj(1));
}
{
UP ptr(UP(new Obj(2)));
}
{
auto lambda = []() {
UP ptr(new Obj(3));
return ptr;
};
UP ptr2(lambda());
}
}
int main() {
cout << "unique_ptr" << endl;
test(unique_ptr<Obj>());
cout << endl;

cout << "UniquePtr" << endl;
test(UniquePtr<Obj>());
cout << endl;

return 0;
}
unique_ptr
new 1
delete 1
new 2
delete 2
new 3
delete 3

UniquePtr
new 1
delete 1
new 2
delete 2
new 3
delete 3
delete 0
free(): double free detected in tcache 2
Aborted

最佳答案

t_ 在您的 move 构造函数中未初始化,因此 moved from 指针最终指向未初始化的指针并具有未定义的行为(这将在 moved from 对象破坏和 deletes 未初始化的指针)。你需要:

UniquePtr(UniquePtr&& oth)
: t_(nullptr)
{
std::swap(t_, oth.t_);
}

或者可能更简单:

UniquePtr(UniquePtr&& oth)
: t_(std::exchange(oth.t_, nullptr)
{
}

关于c++ - 为什么我的 UniquePtr 实现会重复释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72825008/

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