c++ - 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 运算符并继续循环。
我的问题是,删除运算符的目的是什么?是否通知操作系统我们不再需要内存?或者只是调用析构函数,然后析构函数通知操作系统收回内存。
解决方案
推荐阅读
- java - Android Java su命令权限被拒绝
- android - 当手机在android中进入睡眠模式时服务停止
- pentaho - Pentaho Kettlespoon - 如何创建一个包含 31 列浮动类型数据的列表以检查它是 NULL/NOT NULL
- node.js - node.js 中的端口重定向
- javascript - ReactJS 如何显示获取响应 onClick
- javascript - 缓冲区 toString 包括所有字母
- c# - 在 Unity 中连续发射激光
- visual-studio - 是否可以在 powershell 下启动一个进程并让 Visual Studio 立即连接到它进行调试
- ios - 关于 UIImageWriteToSavedPhotosAlbum(:::) 方法
- apache-kafka - Kafka 中的性能测试