unique_ptr or vector?

后端 未结 5 751
孤城傲影
孤城傲影 2020-12-16 14:23

If you don\'t need dynamic growth and don\'t know the size of the buffer at compile time, when should unique_ptr be used instead of vector<

5条回答
  •  忘掉有多难
    2020-12-16 14:57

    If you're in a position where vector is even a possibility, you probably want to go with that except in extreme and rare circumstances. And even then, a custom type instead of unique_ptr may well be the best answer.

    So what the heck is unique_ptr good for? :-)

    unique_ptr really shines in two circumstances:

    1. You need to handle a malloc/free resource from some legacy function and you would like to do it in a modern exception safe style:

    void
    foo()
    {
        std::unique_ptr p(strdup("some text"), std::free);
        for (unsigned i = 0; p[i]; ++i)
            std::cout << p[i];
        std::cout << '\n';
    }
    

    2. You've need to temporarily secure a new[] resource before transferring it onto another owner:

    class X
    {
        int* data_;
        std::string name_;
    
        static void validate(const std::string& nm);
    public:
        ~X() {delete [] data_;}
    
        X(int* data, const std::string& name_of_data)
            : data_(nullptr),
              name_()
        {
            std::unique_ptr hold(data);  // noexcept
            name_ = name_of_data;               // might throw
            validate(name_);                    // might throw
            data_ = hold.release();             // noexcept
        }
    };
    

    In the above scenario, X owns the pointer passed to it, whether or not the constructor succeeds. This particular example assumes a noexcept default constructor for std::string which is not mandated. However:

    1. This point is generalizable to circumstances not involving std::string.
    2. A std::string default constructor that throws is lame.

提交回复
热议问题