我能给出的最好的例子是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;
}
Run Code Online (Sandbox Code Playgroud)
这在C++中转换为:
Mesh* createMesh(){
SphereGeometry* geometry = new SphereGeometry(10, 5, 5);
MeshPhongMaterial* material = new MeshPhongMaterial;
Mesh* mesh = new Mesh(geometry, material);
return mesh;
}
Run Code Online (Sandbox Code Playgroud)
现在,谁应该有责任删除这3个指针.它应该是图书馆的用户吗?或者应该在Mesh的析构函数中销毁几何和材质,用户应该只删除Mesh指针?如果是这种情况,玩家将如何知道不删除他的指针并避免双重删除?
此外,如果发生这种情况:
SphereGeometry geometry(10, 5, 5);
MeshPhongMaterial material;
Mesh* mesh = new Mesh(&geometry, &material);
Run Code Online (Sandbox Code Playgroud)
谢谢.
我不太明白使用另一个库的库的编译是如何工作的。据我了解,有 4 种情况:
1) 编译使用静态库 (B) 的静态库 (A) :编译会起作用,但链接库 A 不起作用,因为静态库只是包含 A 编译产生的 .o 文件的存档,而不是来自B。是不是在创建静态库时,编译阶段会搜索函数定义并在头中找到它们。在链接阶段,编译器在库 B 中搜索函数实现,如果找到则编译成功,但实际上并没有将函数实现放在静态库 A 中。这就是为什么在链接 A 时它没有工作
2) 编译使用动态库的静态库:我认为创建 A 和使用 A 都可以,但为什么呢?编译器实际上在 dlls/so 中放了什么?
3) 编译使用静态库的动态库:这行得通吗?
4) 编译一个使用另一个动态库的动态库:这也行吗?
谢谢你的时间。