2016-07-04 18 views
0

In Code, der eine Ressource, die einmal und nur einmal freigegeben werden sollte, wickeln, ist es idiomatisch, etwas wie die folgenden zu tun, um dies zu garantieren? Gibt es einen besseren Ansatz?Idiomatische Move Contructor für Ressource, die nur einmal in Destruktor freigegeben werden kann

class SocketWrapper { 
    SocketWrapper() { 
     fd = socket(AF_INET, SOCK_STREAM, 0); 
    } 

    ~SocketWrapper() { 
     if(fd < 0){ 
      close(fd); 
     } 
    } 

    SocketWrapper(SocketWrapper &&other){ 
     fd = other.fd; 
     other.fd = -1; 
    } 
    //similar move assignment 

private: 
    int fd{-1}; 
}; 
+2

Sie sollten wahrscheinlich -1 verwenden, weil 0 eine gültige FD ist. – ysdx

+0

Danke, ich werde das bearbeiten. – cloakedlearning

+0

Ja, es ist idiomatisch. Nein, ich kenne keinen besseren Ansatz. Hinweis: Ich stimme @ysdx zu, außer dass ich den ungültigen Wert für die Zielplattform angeben würde ("INVALID_SOCKET", "-1" usw.). –

Antwort

0

Sie sollten wahrscheinlich auch den Kopierkonstruktor für die Klasse löschen, um sicher zu sein. auch einmal erstellt werden, die Sie verwenden, um eine Singleton

SocketWrapper(const SocketWrapper&) = delete; 

sollte diese sicher zu tun, aber ich denke, wenn man die Ressource wollen. Es gibt Bibliotheken, die Singleton-Funktionalitäten aus der Box bereitstellen. Zum Beispiel: - Folly singleton.

Auch seine immer ratsam, Bibliotheken wiederverwenden, die Wrapper über primitive Steckdosen und werden ausgiebig getestet und daher robust bieten Verlassen stattdessen verwenden die ganze Verpackung Torheit AsyncSocket neu zu schreiben, die ähnliche Abstraktionen bietet, wenn Sie nur grundlegende fd Verpackung Funktionalität wollen.

+3

Sobald der Move-Konstruktor deklariert ist, wird der Kopierkonstruktor implizit gelöscht. Es schadet nicht, auch explizit zu löschen, aber es ist nicht notwendig. –

+0

Ich dachte, dass die Definition der Verschiebung ctor/Zuweisung Operator implizit die Kopie ctor/Zuweisung gelöscht? – cloakedlearning

0

Ich möchte Ihnen empfehlen, ähnliche Strategien wie Smart Pointer zu verwenden. Sowohl shared_ptr als auch unique_ptr werden verwendet, um die Pointer-Ressource zu verwalten.

Für verschiedene Nummern des Besitzers können Sie einen auswählen. Ref: Differences between unique_ptr and shared_ptr