Computer >> Máy Tính >  >> Lập trình >> C ++

xóa cái này trong C ++?

Delete là một toán tử được sử dụng để phân bổ không gian lưu trữ của Biến.

Con trỏ này là một loại con trỏ có thể được truy cập nhưng chỉ bên trong hàm thành viên không tĩnh và nó trỏ đến địa chỉ của đối tượng đã được gọi là hàm thành viên.

Con trỏ này giữ địa chỉ của đối tượng hiện tại, nói một cách đơn giản, bạn có thể nói rằng con trỏ này trỏ đến đối tượng hiện tại của lớp

Bất cứ khi nào chúng ta gọi một hàm thành viên thông qua đối tượng của nó, trình biên dịch sẽ bí mật chuyển địa chỉ gọi đối tượng đó làm tham số đầu tiên trong hàm thành viên dưới dạng con trỏ này.

Nói chung, toán tử xóa không nên được sử dụng cho con trỏ này. Giả sử, nếu được sử dụng, thì các điểm sau đây phải được xem xét.

Tốt nhất, không nên sử dụng toán tử xóa cho con trỏ này. Tuy nhiên, nếu đã sử dụng thì phải cân nhắc những điểm sau.

  • toán tử xóa chỉ hoạt động đối với các đối tượng được cấp phát bằng cách sử dụng toán tử mới (Xem bài đăng này). Nếu đối tượng được tạo bằng new, thì chúng ta có thể xóa đối tượng này, nếu không, hành vi là không xác định.

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;
}
  • Sau khi xóa xong, không nên truy cập bất kỳ thành viên nào của đối tượng đã xóa sau khi xóa.

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;
   }
};

Điều tốt nhất là không xóa cái này.

Xóa con trỏ bên trong hàm thành viên này là sai, chúng ta không bao giờ nên làm điều đó. Nhưng nếu chúng ta làm những điều sau đây có thể xảy ra,

  • Nếu đối tượng mà từ đó hàm thành viên này được gọi được tạo trên ngăn xếp thì việc xóa con trỏ này sẽ làm hỏng ứng dụng của bạn hoặc sẽ dẫn đến hành vi không xác định.

  • Nếu đối tượng mà từ đó hàm thành viên này được gọi được tạo trên heap bằng cách sử dụng toán tử new, thì việc xóa con trỏ này sẽ hủy đối tượng. Nó sẽ không làm ứng dụng bị treo tại thời điểm cụ thể đó nhưng sau đó, nếu một số hàm thành viên cố gắng truy cập vào biến thành viên thông qua đối tượng này thì ứng dụng sẽ bị sập.

Ví dụ

#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;
}

Khi chúng tôi đã xóa con trỏ này trong hàm thành viên hủy (), sau khi gọi hàm displayText () này là an toàn vì nó không truy cập vào bất kỳ hàm thành viên nào. Nhưng việc gọi displayValue () sẽ làm sập ứng dụng vì nó đang truy cập biến thành viên thông qua một con trỏ treo, tức là đã xóa con trỏ này.