在C++库中,谁应该删除指针、用户或库?
In a C++ library, who should delete the pointers, the user or the library?
我能给出的最好的例子是javascript中的Three.js库:
function createMesh(){
var geometry = new THREE.SphereGeometry(10, 5, 5);
var material = new THREE.MeshPhongMaterial();
var mesh = new Mesh(geometry, material);
return mesh;
}
这在C++中转化为:
Mesh* createMesh(){
SphereGeometry* geometry = new SphereGeometry(10, 5, 5);
MeshPhongMaterial* material = new MeshPhongMaterial;
Mesh* mesh = new Mesh(geometry, material);
return mesh;
}
现在,谁应该有责任删除这 3 个指针。它应该是库的用户吗?还是应该在网格的析构函数中销毁几何体和材质,而用户应该只删除网格指针?如果是这种情况,玩家怎么知道不删除他的指针并避免双重删除?
另外,如果发生这种情况怎么办:
SphereGeometry geometry(10, 5, 5);
MeshPhongMaterial material;
Mesh* mesh = new Mesh(&geometry, &material);
谢谢。
使用智能指针,所有权一目了然:
std::unique_ptr<Mesh> createMesh(){
auto geometry = std::make_unique<SphereGeometry>(10, 5, 5);
auto material = std::make_unique<MeshPhongMaterial>();
return std::make_unique<Mesh>(std::move(geometry), std::move(material));
}
它应该是库的用户吗?
库缺少有关何时删除这些对象的可靠信息,因此它必须是用户。不过,他不需要手动执行此操作(请参阅末尾有关智能指针的要点(。
还是应该在网格的析构函数中销毁几何体和材质,而用户应该只删除网格指针?
在构造函数中转移所有权是一种可行的替代方案。它还允许您将代码"折叠"为更短的内容,这在单独删除时是不可能的:
Mesh* mesh = new Mesh(new SphereGeometry(10, 5, 5), new MeshPhongMaterial);
如果是这种情况,玩家怎么知道不删除他的指针并避免双重删除?
通过阅读文档。
另外,如果发生这种情况怎么办:
Mesh* mesh = new Mesh(&geometry, &material);
只要您不使mesh
超出geometry
和material
的范围,就不会发生任何事情。
更好的方法是尽可能避免使用原始指针。在实用的地方使用对象而不是指向对象的指针。在需要动态调整大小时使用集合。当必须有指针时,请使用智能指针。
相关文章:
- 用户定义函数中的指针和输入
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 如何使用构造函数声明指向用户定义对象的指针?
- 有没有办法根据用户参数设置函数指针?
- 函数调用歧义(用户定义的转换和 Derived2Base 指针转换)
- 在C++库中,谁应该删除指针、用户或库?
- 如何使用指针将用户输入存储到向量中
- 通过用户输入到对象的指针的C 向量
- 编写安全包装类以管理用户定义对象的指针
- 如何保护类外用户可以修改的指针地址?C++
- 我在使用 cin.getline() 从用户那里获取 3 个字符串并使用指针数组来存储它们时遇到问题
- 智能指针的成员初始化列表,用于用户定义的结构
- API返回类型--强制将智能指针指向用户
- 使用指针对用户定义对象的C++数组进行排序
- 无法将指针定义为用户定义的类,但我可以直接实例化
- 用户定义类中的Null指针无效
- 是否可以编写一个自定义 STL 分配器,该分配器使用指向用户提供的分配函数的指针
- 用户定义的链表从函数返回指针
- 设置指向用户输入C++的指针
- 获取用户输入并将其存储到指针数组中