簡體   English   中英

在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;
}

現在,誰應該負責刪除這三個指針。 應該是圖書館的用戶嗎? 還是應該在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); 

只要不使meshgeometrymaterial范圍之外都不可用,就不會發生任何事情。

更好的方法是盡可能避免使用原始指針。 在可行的地方,使用對象而不是指向對象的指針。 需要動態調整大小時,請使用集合。 必須具有指針時,請使用智能指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM