首页 > 解决方案 > Cpp:我是否总是需要调用删除运算符

问题描述

昨天我注意到一件很奇怪的事情。

在尝试找到我的程序崩溃的位置后,我发现它发生在我的 Error 类中。那是幽默。我将我的错误信息作为我认为会绑定的 const 引用返回。

现在,意识到临时不会绑定,我决定将我的错误信息作为手动动态内存返回;使用 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 发生的情况是 delete 运算符调用相同的析构函数,该析构函数再次调用 delete 运算符并继续循环。

我的问题是,删除运算符的目的是什么?是否通知操作系统我们不再需要内存?或者只是调用析构函数,然后析构函数通知操作系统收回内存。

标签: c++c++11destructor

解决方案


推荐阅读