Я заметил что-то очень странное вчера.
После попытки определить, где происходит сбой моей программы, я обнаружил, что это происходит из моего класса Error. это был юмор Я возвращал информацию об ошибке в виде константной ссылки, которую я думал связать.
Теперь, осознав временную привязку, я решил вернуть информацию об ошибке в виде динамической памяти вручную; использование ctor и dtor для «удаления» памяти.
Странно, что я все еще терпел крах, и причина была; мой деструктор назывался НЕПРЕРЫВНО;
// error.h
struct ErrorInfo {};
template <class T>
const ErrorInfo& error(const T&);
// Found.h
struct Found
{
const char *begin, *end;
};
Found find(const char*,const char*);
struct Found_ErrorInfo : ErrorInfo
{
const char *type;
char fault[3];
unsigned index;
Found_ErrorInfo()
: type("Not found"), fault{'\e','w',0}, index(0) {};
~Found_ErrorInfo() { delete this; }
};
template <>
const ErrorInfo& error<Found>(const Found &f)
{
return *new Found_ErrorInfo();
}
// main.cpp
int main()
{
Found f = find("dada", "I love my mama");
if(f.begin != nullptr) std::cout << f.begin;
else const ErrorInfo &info = error(f);
}
Как видно из примера, я возвращаю динамически распределяемую информацию об ошибке из функции ошибок, специализированной для struct found. Затем у меня есть деструктор типа Found_ErrorInfo, чтобы удалить эту динамическую память / удалить себя. Nexg - оператор удаления вызывает тот же деструктор, который снова вызывает оператор удаления, и цикл продолжается.
У меня вопрос: какова цель оператора удаления? Чтобы сообщить ОС, что нам больше не нужна память? Или просто вызвать деструктор, а затем деструктор сообщает ОС забрать память.