Ich lese, dass intelligente Zeiger hilfreich in Situation, wenn Konstruktor einige Ausnahmen generieren.intelligente Zeiger und Konstruktor Ausnahmen
Das Problem ist, dass Konstruktor einige Ressourcen vor der Generierung von Ausnahmen hat, aber Destruktor nicht aufgerufen wird (und Ressourcen permanent beschäftigt).
Aber ich kann es nicht richtig verstehen. Mein Code:
#include <memory>
#include <iostream>
class resOwner {
public:
resOwner() {
std::cout << "Map some huge resources\n";
throw "hi";
}
~resOwner() {
std::cout << "Free some huge resources\n";
}
};
class normal : resOwner {
};
int main(){
try {
std::shared_ptr<resOwner> k (new resOwner());
} catch (...) {}
}
Ausgang ist Map some huge resources
. Wie man dieses Ressourcenleck mit intelligenten Zeigern löst?
Keine Sorge - Speicher freigegeben wird, wenn c-tor wirft - ohne Kooperation von Smart-Pointer - siehe http://stackoverflow.com/questions/1674980/who-deletes-the- memory-allowed-within-a-new-operation-which-hat-exception-in – PiotrNycz
Welche Ressource resOwner auch besitzt, muss eine Art Smart-Pointer 'unique_ptr' oder' shared_ptr' usw. sein. Andernfalls werden Sie mit einem Ressourcenleck enden Was immer Sie im Destruktor aufräumen wollten, wird nicht aufgerufen. – Arunmu
Es ist erwähnenswert, dass, wenn ein einzelner Konstruktor vollständig ausgeführt wird (Konstruktordelegierung) und der delegierende Konstruktor einen Writ auslöst, der Destruktor des Objekts aufgerufen wird. – Blazo