Исключение нарезки - это связано с созданным конструктором копирования?
Я только что исправил очень тонкую ошибку в нашем коде, вызванную нарезкой исключения, и теперь я хочу убедиться, что я точно понимаю, что происходит.
Вот наш базовый класс исключений, производный класс и соответствующие функции:
class Exception
{
public:
// construction
Exception(int code, const char* format="", ...);
virtual ~Exception(void);
<snip - get/set routines and print function>
protected:
private:
int mCode; // thrower sets this
char mMessage[Exception::MessageLen]; // thrower says this FIXME: use String
};
class Derived : public Exception {
public:
Derived (const char* throwerSays) : Exception(1, throwerSays) {};
};
void innercall {
<do stuff>
throw Derived("Bad things happened!");
}
void outercall {
try {
innercall();
}
catch(Exception& e)
{
printf("Exception seen here! %s %d\n", __FILE__, __LINE__);
throw e;
}
}
Ошибка, конечно, заключалась в том, что externalcall заканчивал тем, что выбрасывал исключение вместо производного. Моя ошибка возникла из-за того, что в стеке вызовов больше не было попыток отловить Derived.
Теперь я просто хочу убедиться, что я понимаю - я считаю, что на «бросить е»; В строке создается новый объект Exception с использованием конструктора копирования по умолчанию. Это действительно происходит?
Если да, могу ли я заблокировать конструкторы копирования для объектов, которые будут выброшены? Я действительно предпочел бы, чтобы это больше не повторилось, и у нашего кода нет причин копировать объекты Exception (о которых я знаю).
Пожалуйста, не комментируйте тот факт, что у нас есть собственная иерархия исключений. Это немного старомодный дизайн, над которым я работаю, чтобы исправить его (я делаю хорошие успехи. Я избавился от класса домашних строк и многих контейнеров, выращенных дома).
ОБНОВЛЕНИЕ: чтобы было ясно, я исправил ошибку (изменив «throw e» на «throw») еще до того, как задал вопрос. Я просто искал подтверждение того, что происходит.