优秀的编程知识分享平台

网站首页 > 技术文章 正文

C++一个关于delete的幼稚错误

nanyue 2024-12-06 18:00:01 技术文章 7 ℃

# 分析

在项目开发中,遇上这么一个错误:

0xc00000fd stack_overflow

这是一个栈溢出的错误,奇怪,我delete怎么会提示这么一个错误呢?

于是问题了群:


# 总结

这个错误实在是蠢啊!

没有细想,直接写了delete this; 这说明基础还是不扎实。

##delete 的工作方式

delete 运算符将调用函数运算符 delete。

对于不是类类型(class、struct 或 union)的对象,将调用全局 delete 运算符。

对于类类型的对象,如果 delete 表达式以一元范围解析运算符 (::) 开始,则会在全局范围中解析解除分配函数的名称。

否则,**delete 运算符将在释放内存之前为对象调用析构函数(如果指针不为 null)**。

可为每个类定义 delete 运算符;如果给定类不存在这种定义,则会调用全局 delete 运算符。

如果删除表达式用于释放其静态对象具有虚拟析构函数的类对象,则将通过对象的动态类型的虚拟析构函数解析释放函数。

##更为通俗的说明为:

 (1)delete用于释放new操作所分配的内存资源。

 (2)delete与new是配对操作,也就是说,通过new分配的资源,只可以通过delete来释放。

 (3)delete调用时,如果释放的是类对象,那么,它会先调用类中的“析构函数”,再释放类对象所占用的内存空间。

##比如一个类:

class A
{
public:
A(){};
~A(){};
private:
int num = 10;
}
int main()
{
A* a = new A();
delete a;
}

delete a的执行过程如下:

最近发表
标签列表