[英]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;
}
現在,誰應該負責刪除這三個指針。 應該是圖書館的用戶嗎? 還是應該在Mesh的析構函數中銷毀幾何形狀和材質,而用戶應該只刪除Mesh指針? 如果是這種情況,玩家將如何知道不刪除其指針並避免重復刪除?
另外,如果發生這種情況:
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指針?
在構造函數中轉讓所有權是一種可行的選擇。 它還使您可以將代碼“折疊”為較短的內容,而單獨刪除則無法實現:
Mesh* mesh = new Mesh(new SphereGeometry(10, 5, 5), new MeshPhongMaterial);
如果是這種情況,玩家將如何知道不刪除其指針並避免重復刪除?
通過閱讀文檔。
另外,如果發生這種情況:
Mesh* mesh = new Mesh(&geometry, &material);
只要不使mesh
在geometry
和material
范圍之外都不可用,就不會發生任何事情。
更好的方法是盡可能避免使用原始指針。 在可行的地方,使用對象而不是指向對象的指針。 需要動態調整大小時,請使用集合。 必須具有指針時,請使用智能指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.