成员函数内delete this
时间: 2023-09-15 18:20:49 浏览: 47
在成员函数内使用delete this会导致当前对象被销毁。这种做法一般用于对象自我销毁的场景,比如对象完成某项任务后需要自我销毁。但需要注意的是,使用delete this要非常小心,因为一旦对象被销毁后,成员函数中使用该对象的任何操作都将变得不可预期。因此,建议只在特定场景下使用delete this,并且一定要确保使用该对象的所有操作都已完成。
相关问题
析构函数中delete
析构函数中调用delete this的作用是释放对象所占用的内存空间。然而,这样的操作可能会导致死循环,因为每次调用delete都会触发析构函数的调用,而析构函数又调用delete,形成了一个循环。这会导致堆栈溢出的问题。[1]
在对象的生命周期结束时,析构函数会自动被调用来释放对象所占用的资源。而delete操作是释放对象的标志,表示对象的生命周期结束,因此delete是析构函数被调用的充分条件。[2]
需要注意的是,析构函数的调用可能会使用delete来释放对象的某些成员占用的内存,以达到释放整体资源的目的。但是,并不是所有的成员都需要使用delete来释放内存,只有那些动态分配的内存才需要使用delete。因此,delete和析构函数之间并没有必然的联系。[2]
总结来说,系统调用delete时会在delete内部调用对象的析构函数,对象被销毁时首先调用析构函数。delete释放内存空间只是对使用该内存空间的对象调用析构函数,并指定该处空间已经无对象使用。如果在对象内部使用了new来动态分配内存,那么在析构函数中需要使用delete来释放这部分内存。[3]
(1)定义一个类location,用数据成员x、y表示该类对象在二维坐标系中的坐标位置,用成员函数move改变对象坐标位置,成员函数draw显示坐标值。 (2)以类location为基类,派生出点类point,重载成员函数move改变对象坐标位置,成员函数draw显示坐标点到原点的位移。 (3)再利用点类point派生出圆类circle,用数据成员r表示圆的半径,成员函数move改变对象半径和坐标,成员函数draw显示圆的面积。 在主函数中定义各类的对象并调用成员函数以测试功能。
以下是实现上述功能的代码:
```c++
#include <iostream>
#include <cmath>
using namespace std;
class Location {
protected:
double x, y;
public:
Location(double x, double y) {
this->x = x;
this->y = y;
}
void move(double dx, double dy) {
x += dx;
y += dy;
}
void draw() {
cout << "x = " << x << ", y = " << y << endl;
}
};
class Point : public Location {
public:
Point(double x, double y) : Location(x, y) {}
void move(double dx, double dy) {
Location::move(dx, dy);
}
void draw() {
double distance = sqrt(x * x + y * y);
cout << "distance to origin = " << distance << endl;
}
};
class Circle : public Point {
private:
double r;
public:
Circle(double x, double y, double r) : Point(x, y) {
this->r = r;
}
void move(double dx, double dy) {
Point::move(dx, dy);
r += dx + dy;
}
void draw() {
double area = 3.14 * r * r;
cout << "area of circle = " << area << endl;
}
};
int main() {
Location* l = new Location(1, 2);
l->draw();
l->move(3, 4);
l->draw();
Point* p = new Point(3, 4);
p->draw();
p->move(1, 1);
p->draw();
Circle* c = new Circle(5, 6, 2);
c->draw();
c->move(2, 3);
c->draw();
delete l;
delete p;
delete c;
return 0;
}
```
在上述代码中,我们先定义了一个基类Location,其中包含了x和y两个数据成员以及move和draw两个成员函数。然后,我们以Location为基类派生出了一个点类Point,并重载了它的move和draw函数。最后,我们再以点类Point为基类派生出了圆类Circle,并再次重载了它的move和draw函数。
在主函数中,我们分别定义了三个对象,分别是一个Location,一个Point,和一个Circle,并测试了它们的各个成员函数的功能。