Shared_ptr类和unique_ptr变量问题

时间:2017-03-21 03:46:24

标签: c++ memory game-engine shared-ptr unique-ptr

我正在尝试使用指向window类的共享指针和指向SDL_Window的unique_ptr(即window类的成员变量)。我似乎对window类中的唯一成员变量有一些内存访问问题,并且就我的指针错误而言有点困惑,据我所知我正在使用smart_pointers

一些背景知识:

我正在尝试制作一个非常简单的游戏引擎。我希望engine类能够指向所有窗口以发出回调等。我想我会使用shared_ptr来实现此功能。由于除了window类之外没有其他人需要直接访问SDL_window我认为最好将其设为unique_ptr

注意

除了以下main()函数之外的所有内容都在dll中(不确定是否会产生影响)

struct SK_API sdl_deleter {
    void operator()(SDL_Window* p) const { SDL_DestroyWindow(p); }
    void operator()(SDL_Renderer* p) const { SDL_DestroyRenderer(p); }
    void operator()(SDL_Texture* p) const { SDL_DestroyTexture(p); }
    void operator()(SDL_Surface* p) const { SDL_FreeSurface(p); }
};

 int main(int argc, char** argv)
{
    sky::g_Engine.startup();
std::shared_ptr<sky::Window> window;

window->createWindow("Hello World!", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 200, 200, SDL_WINDOW_ALLOW_HIGHDPI);

sky::g_Engine.engineLoop();

sky::g_Engine.shutdown();

return EXIT_SUCCESS;
}


namespace sky {
    class Engine;

    class SK_API Window {
        friend class Engine;
    public:
        void createWindow(const char* title, int x, int y, int width, int height, uint32_t flags);
    protected:
        std::unique_ptr<SDL_Window, sdl_deleter> m_window = nullptr;
    };
}

namespace sky {
    void Window::createWindow(const char* title, int x, int y, int width, int height, uint32_t flags)
    {
        m_window = std::unique_ptr<SDL_Window, sdl_deleter>(SDL_CreateWindow(title, x, y, width, height, flags), sdl_deleter());
        if (nullptr == m_window) {
            std::cout << "window create error" << SDL_GetError() << std::endl;
        }
    }
}

class SK_API Engine : public Singleton<Engine> {
        friend class Singleton<Engine>;
        friend class Window;
    public:
        void startup();
        void shutdown();
        void engineLoop();
        void registerWindow(std::shared_ptr<Window> window);
    private:
        std::vector<std::shared_ptr<Window>> m_windows;
        bool m_isRunning = false;
    };

0 个答案:

没有答案