为什么std :: unique_ptr构造函数接受外部指针

FRR:

我对cpp比较陌生,所以如果这是一个愚蠢的问题,请原谅。我正在学习智能点,但我想知道以下几点:为什么std::unique_ptr允许使用左值构造an

只允许构造std::unique_ptr带有右值的a以避免像这样的邪恶事情会更安全

    std::unique_ptr<int> createInt() {
        int* a = new int(99);
        std::unique_ptr<int> foo(a);
        delete a;
        return foo;
    }

我意识到您必须疯狂地编写类似的东西,但是很高兴编译器为此大吼大叫。所以我不禁要问,为什么unique_ptr的左值初始化是一件事情?

编辑:用户@aler egal更卑鄙地提出了我的想法:

“原则上,您可以拥有一个构造函数unique_ptr(int * && ptr),该构造函数假定ptr拥有所有权,然后将其设置为null。在此特定示例中,这将防止使用free-after-free(因为您将被迫进行std :: move(a),因为在空指针上调用delete无效),但这将是非常奇怪的反模式。”

d4rk4ng31:

这是一个悬空指针的经典示例与智能指针看上去相反,它们只是普通(原始)指针的包装,后者可以自行管理内存并为您提供一些附加功能。

考虑以下示例:

int* someFunc() {
    int* ptr;
    int* ptr2 = ptr;
    delete ptr;
    return ptr2;
}

这就是您要做的。
他们已经做了这样它们可以被用来代替原所属指针在任何时候 ; 意思是,它们也可以悬挂因此,如果不允许它们进行左值初始化,那么这是一个不能使用智能指针的用例,尽管我同意,但是这是不使用两者的一种情况!

上面带有智能指针的代码将完全是您尝试过的代码。

现在,C ++完全给您留下了逻辑。如果您想用脚射击自己,那就继续吧,C ++不会吠叫。C ++不检查内存使用情况,缓冲区溢出以及已删除内存的访问。简而言之,这是C ++程序员的工作,如果他/她想用脚开枪,他/她可以自由地这样做!


另外,通常建议std::make_ptr()在ctor 上使用,因为前者已启用例外

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么std :: unique_ptr :: reset()总是noexcept?

为什么用std :: make_unique代替std :: unique_ptr :: make?

为什么std :: unique_ptr构造函数接受外部指针?

为什么unique_ptr具有nullptr_t构造函数?

为什么std :: shared_ptr <T> = std :: unique_ptr <T []>可以编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不可以编译?

为什么要为具有非平凡析构函数的类声明constrexpr构造函数(例如unique_ptr,std :: variant)

来自T *的std :: unique_ptr <T>的构造函数背后的原因是什么?

为什么std :: unique_ptr没有像std :: shared_ptr这样的别名构造函数?

是否可以使用fill构造函数创建std :: vector <std :: unique_ptr <Bar >>?

std :: list <std :: unique_ptr>:空的初始化列表与默认构造函数

奇怪的错误:当未真正创建指针时,使用删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr

Pimpl with unique_ptr:为什么我必须将接口的构造函数定义移至“ .cpp”?

为什么为不完整类型构造std :: unique_ptr?

为什么std :: unique_ptr重设与赋值不同?

std :: unique_ptr析构函数构造函数顺序

为什么std :: istream_iterator构造函数返回指针

std :: unique_ptr构造函数的行为

为什么unique_ptr和shared_ptr不会使它们的构造指针无效?

如果没有noexcept move构造函数,为什么带有std :: vector的代码不能编译却带有std :: unique_ptr的代码可以编译?

为什么在移动Unique_ptr时在lambda中调用复制构造函数?

为什么在构造函数调用异常后不释放unique_ptr?

std :: unique_ptr constexpr构造函数

为什么 std::make_unique 调用复制构造函数

结合 std::unique_ptr 和命名构造函数

为什么我需要移动 `std::unique_ptr`

为什么 std::unique_ptr 没有优化而 std::variant 可以?

unique_ptr 中的指针()是什么?

为什么 std::unique_ptr<>.release() 在赋值 lhs 中的成员函数访问之前被评估?

为什么 std::unique_ptr<>.release() 在赋值 lhs 中的成员函数访问之前得到评估?