Home > Blockchain >  how do I tell an array pointer from a regular pointer
how do I tell an array pointer from a regular pointer

Time:09-17

I'm writing a smart pointer like std::shared_ptr since my compiler does not support c 17 and later versions, and I want to support array pointer like:

myptr<char []>(new char[10]);

well, it went actually well, until I got the same problem as old-version std::shared_ptr got:

myptr<char []>(new char);

yeah, it can't tell whether it's a regular pointer or an array pointer, and since my deleter is kind of like:

deleter = [](T *p) {delete[] p;}

which means it just meets the same problem that the old-version std::shared_ptr has.

my array-pointer partial specialization is like:

template <typename T, typename DeleterType>
class myptr<T[], DeleterType> { // DeleterType has a default param in main specialization
                                // as std::function<void(T*)>
private:
    my_ptr_cnt<T, DeleterType> *p; // this is the actual pointer and count maintain class
public:
    // constructor
    /// \bug here:
    my_ptr(T *p, DeleterType deleter=[](T *p) {delete []p;}) :
        p(new my_ptr_cnt<T, DeleterType>(p, deleter)) { }

}

CodePudding user response:

You can't. This is one of the many reasons that raw arrays are bad.

What you can do is forbid construction from raw pointer, and rely on make_shared-like construction.

  • Related