我正在尝试创建一个GUI库。我希望以下声明有效。此外,用户不负责释放内存。
// Create a GUI context
xGUI::xGUI gui(800, 600);
// gui.objects is a std::map<std::string, IWidget *>
gui.objects["btn"] = new xGUI::Button("Close", 50, 50);
gui.objects["btn2"] = gui.objects["btn"]->clone();
// Block end gui will free all the objects.
正如您所看到的,克隆是丑陋但需要。(有没有解决方案?)但是这个克隆将使用new来分配库中的内存。然后由我在头文件中写的xGUI的dtor自由。在库中新建并在主程序中删除...这会是一个问题吗?
答案 0 :(得分:3)
而是使用std::map<std::string, IWidget*>
考虑使用std::map<std::string, std::unique_ptr<IWidget>>
。
std::unique_ptr<T>
是一个围绕对象的特殊包装器,它会在unique_ptr
本身被销毁时自动管理对象的破坏。这使得在具有单个所有者的对象上管理内存(就像在您的情况下看起来那样)非常简单。
答案 1 :(得分:0)
不要使用指针,但包装器的行为类似于引用计数智能指针并公开所需的接口:
NSScrollView
看看ma,没有指针,没有内存泄漏。
看看这个具有多态行为的json库,但不需要用户处理动态内存分配:https://github.com/TorstenRobitzki/Sioux/blob/master/source/json/json.h