如何在这种情况下安全地使用 new 和 delete

How to safely use new and delete for this situtation

我正在尝试制作一个 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.

正如你所看到的,克隆是丑陋的但需要。(有什么解决方案吗?)但是这个克隆将使用新的来分配库中的内存。然后由我在头文件中编写的 xGUI 的 dtor 免费。在库中新建并在主程序中删除...会不会有问题??

而不是使用 std::map<std::string, IWidget*> 考虑使用 std::map<std::string, std::unique_ptr<IWidget>>

std::unique_ptr<T> 是对象的特殊包装器,当 unique_ptr 本身被销毁时,它将自动管理对象的销毁。这使得管理具有单个所有者的对象的内存(就像你的情况一样)非常微不足道。

不使用指针,而是使用类似于引用计数智能指针并公开所需接口的包装器:

// Create a GUI context
xGUI::xGUI gui(800, 600);
// gui.objects is a std::map<std::string, IWidget *>
gui.objects["btn"] = xGUI::Button("Close", 50, 50);
gui.objects["btn2"] = gui.objects["btn"].clone();

你看,没有指针,没有内存泄漏。

看看这个 json 库,具有多态行为,但不需要用户处理动态内存分配:https://github.com/TorstenRobitzki/Sioux/blob/master/source/json/json.h