在C++库中,谁应该删除指针、用户或库?

In a C++ library, who should delete the pointers, the user or the library?

本文关键字:指针 用户 删除 库中 C++      更新时间:2023-10-16

我能给出的最好的例子是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超出geometrymaterial的范围,就不会发生任何事情。

更好的方法是尽可能避免使用原始指针。在实用的地方使用对象而不是指向对象的指针。在需要动态调整大小时使用集合。当必须有指针时,请使用智能指针。