在C ++中“删除此”?
Delete是用于取消分配Variable存储空间的运算符。
该指针是一种只能在非静态成员函数内部访问的指针,它指向已调用成员函数的对象的地址。
这个指针保存当前对象的地址,用简单的话来说,可以说这个指针指向该类的当前对象
每当我们通过其对象调用成员函数时,编译器都会秘密地将调用该对象的地址作为该成员函数中的第一个参数传递。
通常,不应将delete运算符用于此指针。假设,如果使用,则必须请看以下几点。
理想情况下,不应将delete运算符用于此指针。但是,如果使用,则必须请看以下几点。
delete运算符仅适用于使用new运算符分配的对象(请参阅此文章)。如果对象是使用new创建的,那么我们可以删除它,否则,行为是不确定的。
filter_none edit play_arrow brightness_4 class A { public: void fun() { delete this; } }; int main() { /* Following is Valid */ A *ptr = new A; ptr->fun(); ptr = NULL; // make ptr NULL to make sure that things are not accessed using ptr. /* And following is Invalid: Undefined Behavior */ A a; a.fun(); getchar(); return 0; }
删除完成后,删除后不应访问已删除对象的任何成员。
filter_none edit play_arrow brightness_4 #include<iostream> using namespace std; class A { int x; public: A() { x = 0;} void fun() { delete this; /* Invalid: Undefined Behavior */ cout<<x; } };
最好的事情是根本不要删除它。
在成员函数中删除该指针是错误的,我们绝对不要这样做。但是,如果我们执行以下操作,则可能会发生,
如果在堆栈上创建了调用该成员函数的对象,则删除该指针将导致应用程序崩溃或导致未定义的行为。
如果使用new运算符在堆上创建了调用该成员函数的对象,则删除该指针将破坏该对象。它不会在那个特定时间使应用程序崩溃,但是在此之后,如果某个成员函数尝试通过该对象访问成员变量,则应用程序将崩溃。
示例
#include <iostream> class Dummy { int m_value; public: Dummy(int val) : m_value(val) {} void destroy(); void displayValue(); void displayText(); }; void Dummy::destroy() { delete this; } void Dummy::displayValue() { std::cout << this->m_value << std::endl; } void Dummy::displayText() { std::cout << "Not accessing any member function" << std::endl; } int main() { Dummy * dummyPtr = new Dummy(5); dummyPtr->destroy(); dummyPtr->displayText(); return 0; }
一旦我们删除了destroy()
成员函数中的该指针,此调用之后displayText()
便是安全的,因为它不访问任何成员函数。但是调用displayValue()
会导致应用程序崩溃,因为它通过悬空指针访问成员变量,即删除了该指针。