c ++具有自定义删除程序错误的唯一指针

时间:2016-04-09 23:28:14

标签: c++ pointers

我正在尝试使用带有自定义删除器的唯一指针创建一个包装器类。这是班级:

class WindowObj
{
    public:
        WindowObj();
        WindowObj(const WindowObj&) = delete;
        WindowObj& operator=(const WindowObj&) = delete;
        WindowObj(WindowObj&&);
        WindowObj& operator=(WindowObj&&);
        WindowObj(const char* title,int x,int y,const int& w,const int& h,SDL_WindowFlags flags);
        SDL_Window* get();
    protected:
    private:
    std::unique_ptr<SDL_Window,decltype(&SDL_DestroyWindow)> window;
};
WindowObj::WindowObj(const char* title,int x,int y,const int& w,const int& h,SDL_WindowFlags flags)
{
    window = make_resource(SDL_CreateWindow,SDL_DestroyWindow,title,x,y,w,h,flags);
}


SDL_Window* WindowObj::get(){
    return window.get();
}

WindowObj::WindowObj(){
    window = NULL;
}

WindowObj::WindowObj(WindowObj&& other){
    std::swap(window,other.window);
}

WindowObj& WindowObj::operator=(WindowObj&& other){
    std::swap(window,other.window);
}

问题在于,当我尝试编译时,我收到错误error: static assertion failed: constructed with null function pointer deleter。使用shared_ptr来修复问题,但我可能不需要共享指针。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

你没有初始化window,你在第一次默认构建之后就分配给它(使用空删除器,因此错误)。

您需要使用成员初始值设定项列表来实际初始化它:

WindowObj::WindowObj(const char* title,int x,int y,const int& w,const int& h,SDL_WindowFlags flags)
: window(make_resource(SDL_CreateWindow,SDL_DestroyWindow,title,x,y,w,h,flags))
{
}

(假设make_resource返回unique_ptr并将第二个参数传递给其构造函数。)

答案 1 :(得分:1)

您从未将SDL_DestroyWindow传递给窗口(对于unique_ptr本身,而不是其内容)。 尝试

WindowObj::WindowObj(const char* title,int x,int y,const int& w,const int& h,SDL_WindowFlags flags)
    : window(make_resource(SDL_CreateWindow,SDL_DestroyWindow,title,x,y,w,h,flags), &SDL_DestroyWindow) {}