2016-11-09 1 views
0

Warum werden die Kopier- und Zuweisungskonstruktoren in request_handler in the ASIO http server example gelöscht? Hier ist der Header die Lookup zu speichern:Gelöschte Kopier- und Zuweisungskonstruktoren in request_handler des HTTP-Serverbeispiels

class request_handler 
{ 
public: 
    request_handler(const request_handler&) = delete; 
    request_handler& operator=(const request_handler&) = delete; 

    /// Construct with a directory containing files to be served. 
    explicit request_handler(const std::string& doc_root); 

    /// Handle a request and produce a reply. 
    void handle_request(const request& req, reply& rep); 

private: 
    /// The directory containing the files to be served. 
    std::string doc_root_; 

    /// Perform URL-decoding on a string. Returns false if the encoding was 
    /// invalid. 
    static bool url_decode(const std::string& in, std::string& out); 
}; 

Wenn überhaupt, scheint, dass das einzige Feld doc_root_ können Konstrukteure const und Standard gemacht werden würde, wenn nötig? Der Code kopiert den Handler im veröffentlichten Beispiel nicht wirklich. Allerdings erkunde ich die Möglichkeit in meinem Code und es wäre toll zu verstehen, wenn mir etwas sehr Grundlegendes fehlt.

Antwort

1

Dies ist sinnvoll, da das Kopieren von doc_root_ zu zusätzlicher Speicherzuweisung führen kann. Das bedeutet, dass für jede neue connection die request_handler an die Verbindung kopiert wird, wodurch eine Speicherzuweisung vorgenommen wird (wenn SSO nicht auf die string Größe von natürlich anwendbar ist).

Wenn ich unnötige Zuordnungen vermeiden kann, würde ich das auf jeden Fall tun, mehr in dem Fall, in dem request_handler keine pro connection spezifischen Daten speichert.

HINWEIS: Ich bin bereit, dies als Kommentar zu verschieben, wenn es die Frage nicht vollständig beantwortet.

+0

Vermisse ich, wo ein 'request_handler' kopiert werden könnte? Der "connection" -Konstruktor nimmt es als Referenz: https://github.com/boostorg/asio/blob/boost-1.62.0/example/cpp11/http/server/connection.cpp#L21. Wenn es irgendwo kopiert würde, würde der aktuelle Code mit dem explizit gelöschten Kopierkonstruktor nicht funktionieren. Ich kann verstehen, wenn die Löschung ein Schutz gegen einen versehentlichen zukünftigen Kopiercode ist, aber das ist alles was ich mir vorstellen kann. Noch etwas? –

+1

Ja, in dem einmal erstellten Code 'request_handler' wird immer als Referenz gespeichert. Wenn es überhaupt versehentlich kopiert wurde, würde der Compiler weinen und fehlschlagen, weil die Kopier- und Zuordnungsfunktionen als gelöscht markiert sind. Ja, Löschen ist ein Schutzmechanismus, um dem Leser (und Compiler) zu sagen, dass das Objekt nicht kopiert werden kann und was ich beantwortet habe, ist einer der Gründe dafür. Es gibt andere Gründe, dasselbe zu tun, aber das passt am besten mit dem fraglichen Code. – Arunmu