У нас есть пользовательский класс ошибок, который используется всякий раз, когда мы бросаем исключение:C++: Выбрасывание исключения вызывает конструктор копирования?
class AFX_CLASS_EXPORT CCLAError : public CObject
Он определил следующий конструктор копирования:
CCLAError(const CCLAError& src) { AssignCopy(&src); } // (AssignCopy is a custom function)
Первоначально она была написана и составлена / связана с MSVC6 (Visual Studio 2003). Я нахожусь в процессе выполнения необходимых изменений, чтобы получить его для компиляции и ссылку на MSVC8 + (VS 2008+)
Когда msvc8 линкер вызывается, я получаю следующее сообщение об ошибке:
LNK2001: unresolved external symbol "private: __thiscall CObject::CObject(class CObject const &)" ([email protected]@[email protected]@@Z)
Я понимаю, что ошибка говорит мне: никакой конструктор копирования не определен для некоторого дочернего объекта CObject, поэтому он проходит весь путь до дерева наследования до тех пор, пока он не ударит CObject, который не определен как конструктор копирования.
Впервые я увидел ошибку при компиляции библиотеки, которая определяет и сначала бросает CCLAError
, поэтому я продолжаю, как будто это причина.
Я был в состоянии устранить ошибку, изменив
в
throw new CCLAError(...)
и
catch(CCLAError& e)
{
throw e;
}
в
catch(CCLAError& e)
{
throw;
}
Однако я не понимаю, почему повторное бросание исключенного пойма вызовет конструктор копирования. Я пропущу что-то совершенно очевидное? Впоследствии почему удаление переменной, содержащей ссылку на исключенное исключение, вызывает вызов конструктора копирования?
Вам не нужно, а также не должно быть, используя 'new' при бросании исходного исключения. Но вам определенно нужно изменить 'throw e', чтобы просто« бросить », чтобы повторно выбросить существующее исключение, не создавая его нового экземпляра. –