如何安全地使用new和delete for this situtation

时间:2016-05-14 15:27:55

标签: c++ api design-patterns memory heap-memory

我正在尝试创建一个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自由。在库中新建并在主程序中删除...这会是一个问题吗?

2 个答案:

答案 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