小编Enh*_*nce的帖子

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

我能给出的最好的例子是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)

谢谢.

c++ pointers

1
推荐指数
2
解决办法
96
查看次数

在 C++ 中编译使用另一个库的库

我不太明白使用另一个库的库的编译是如何工作的。据我了解,有 4 种情况:

1) 编译使用静态库 (B) 的静态库 (A) :编译会起作用,但链接库 A 不起作用,因为静态库只是包含 A 编译产生的 .o 文件的存档,而不是来自B。是不是在创建静态库时,编译阶段会搜索函数定义并在头中找到它们。在链接阶段,编译器在库 B 中搜索函数实现,如果找到则编译成功,但实际上并没有将函数实现放在静态库 A 中。这就是为什么在链接 A 时它没有工作

2) 编译使用动态库的静态库:我认为创建 A 和使用 A 都可以,但为什么呢?编译器实际上在 dlls/so 中放了什么?

3) 编译使用静态库的动态库:这行得通吗?

4) 编译一个使用另一个动态库的动态库:这也行吗?

谢谢你的时间。

c c++

0
推荐指数
1
解决办法
2414
查看次数

标签 统计

c++ ×2

c ×1

pointers ×1