C ++: Wird eine Ausnahme ausgelöst, wird der Kopierkonstruktor aufgerufen?

Wir haben eine benutzerdefinierte Fehlerklasse, die immer dann verwendet wird, wenn wir eine Ausnahme auslösen:

class AFX_CLASS_EXPORT CCLAError : public CObject

Es wurde der folgende Kopierkonstruktor definiert:

CCLAError(const CCLAError& src) { AssignCopy(&src); } // (AssignCopy is a custom function)

Es wurde ursprünglich mit MSVC6 (Visual Studio 2003) geschrieben und kompiliert / verlinkt. Ich bin dabei, die notwendigen Änderungen vorzunehmen, damit MSVC8 + (VS 2008+) kompiliert und verlinkt werden kann.

Wenn der Msvc8-Linker aufgerufen wird, erhalte ich den folgenden Fehler:

LNK2001: unresolved external symbol "private: __thiscall CObject::CObject(class CObject const &)" (??0CObject@@AAE@ABV0@@Z)

Ich verstehe, was mir der Fehler sagt: Für ein CObject-Kind ist kein Kopierkonstruktor definiert, daher wird der gesamte Vererbungsbaum durchlaufen, bis CObject erreicht wird, das als kein Kopierkonstruktor definiert ist.

Ich habe zum ersten Mal den Fehler beim Kompilieren der Bibliothek gesehen, die definiert und zuerst a auslöstCCLAErrorDeshalb gehe ich so vor, als sei das die Ursache.

Ich konnte den Fehler durch Ändern beheben

throw CCLAError( ... )

zu

throw new CCLAError( ... )

und

catch(CCLAError& e)
{
   throw e;
}

zu

catch(CCLAError& e)
{
   throw;
}

Ich verstehe jedoch nicht, warum das erneute Auslösen einer abgefangenen Ausnahme den Kopierkonstruktor aufrufen würde. Fehlt mir etwas ganz offensichtliches? Warum wird der Kopierkonstruktor dann nicht aufgerufen, wenn die Variable entfernt wird, die einen Verweis auf eine festgestellte Ausnahme enthält?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage