Cpp: мне всегда нужно вызывать оператор удаления - PullRequest
0 голосов
/ 08 мая 2019

Я заметил что-то очень странное вчера.

После попытки определить, где происходит сбой моей программы, я обнаружил, что это происходит из моего класса 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 - оператор удаления вызывает тот же деструктор, который снова вызывает оператор удаления, и цикл продолжается.

У меня вопрос: какова цель оператора удаления? Чтобы сообщить ОС, что нам больше не нужна память? Или просто вызвать деструктор, а затем деструктор сообщает ОС забрать память.

...