代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

为什么unique_ptr::release()不释放分配的内存?

c++
  •  -2
  • Rick Jim DeLaHunt  · 技术社区  · 7 年前

    我被教导:

    u=nullptr 删除唯一指针 u points;makes u null的对象

    u.release() 放弃对指针的控制

    afaik, unique_ptr::release() should not free the allocated memory,because it's invented for transferring ownership.

    所以我在想,在 u.release()中提到的“makes u null”与 u=nullptr 不同。可能 u 本身不为空,而仅为 get.() returns null ptr as recorded in cppreference

    但我得到:

    include<memory>
    #包括<iostream>
    使用命名空间std;
    int主()
    {
    唯一的指针<字符串>p1(新字符串(“谢谢大家”));
    字符串*p2=p1.release();
    CUT & LT;&;STD::布尔阿尔法& lt;lt;(p1==nullpTr);//true:
    }
    
    
    

    因此,在release()之后,p1==nullptr,那么为什么在这种情况下分配的动态内存没有释放?我怀念什么?


    . 放弃对指针的控制U保持;返回指针U曾举办过并制作U无效的;

    嗯,unique_ptr::release()不应该释放分配的内存,因为它是为转移所有权而发明的。

    所以我想U空”中提到u.释放()上面不一样U=空指针. 也许吧U它本身不是空的,而且get.()退货nullptr如中所述cpprefence.

    但我得到:

    #include <memory> 
    #include <iostream> 
    using namespace std;
    int main()
    {
        unique_ptr<string> p1(new string("Thank you guys"));
        string* p2 = p1.release();
        cout << std::boolalpha << (p1 == nullptr); //true
    }
    

    所以之后release(),p1 == nullptr那么,在这种情况下,为什么不释放分配的动态内存呢?我怀念什么?


    2 回复  |  直到 7 年前
        1
  •  4
  •   Jarod42    7 年前

    我怀念什么?

    p2 .

    delete

    u u = nullptr

    U=空指针

    u.release()

    1. u

    如果“制造 “空”被定义为等价于 u == nullptr true

    unique_ptr

    template<typename T>
    class unique_ptr
    {
        T* ptr;
    public:
        explicit unique_ptr(T* arg = nullptr) : ptr(arg) {}
        ~unique_ptr() { delete ptr; }
    
        unique_ptr(const unique_ptr&) = delete;
        unique_ptr& operator=(const unique_ptr&) = delete;
    
        unique_ptr& operator=(std::nullptr_t) { delete ptr; ptr = nullptr; }
        T* release() { T* temp = ptr; ptr = nullptr; return temp; }
    
        friend bool operator==(const unique_ptr& lhs, const T* rhs) { return lhs.ptr == rhs; }
        friend bool operator==(const T* lhs, const unique_ptr& rhs) { return lhs == rhs.ptr; }
    }
    

    赋值将删除存在的内容,然后分配传递的参数。 release nullptr ,然后返回副本。

        2
  •  1
  •   Fantastic Mr Fox    7 年前

    unique_ptr shared_ptr .你可以这样做:

    shared_ptr<string> upgrade(p1.release());
    

    c 图书馆。

    u = nullptr 您没有释放指针。没有人能恢复 u operator=


    std::shared_ptr<std::string> shared = std::move(unique);