[C++] Một số vấn đề thú vị trong C++ (P1)

1. Macro

  • Đại diện cho 1 khối lệnh thực hiện 1 công việc nào đó
  • Được định nghĩa bằng lệnh #define.

1 số chú ý về macro :

  • Không thể debug tìm lỗi macro lúc runtime
  • Có thể truyền tham số và không quan tâm đến kiểu dữ liệu
  • Macro sẽ tạo ra inline code nên thời gian xử lý nhanh hơn gọi hàm, tuy nhiên gọi nhiều lần sẽ làm kích thước chương trình lớn lên.
  • Tránh side effect khi truyền tham số cho macro
#define SQUARE(a) a * a

int res = SQUARE (3+4); // Kết quả 3 + 4 * 3 + 4 = 19

2. Con trỏ

  • Cấp phát bộ nhớ con trỏ
int* ptr = new int; // *ptr sẽ có giá trị rác

int* ptr1 = new int(); //*ptr sẽ có giá trị 0
  • Giải phóng bộ nhớ:
if (ptr != nullptr)
{
   delete ptr;
   
   ptr = nullptr;
}

Hoặc

delete ptr;

ptr = nullptr;

=> Bạn dùng cách nào, có check null trước khi delete con trỏ?

Sẽ xảy ra vấn đề gì khi delete con trỏ null?

3. Truy cập từ con trỏ null của class

class Exp
{
   public :
      int val;
            
      void Display()
      {
         cout << "This fuction test null object";
      }
};

int main()
{
   Exp* exp = nullptr;
   
   exp -> Display();
}

=> Chương trình sẽ chạy thế nào ?

Kết quả : Chương trình chạy bình thường.

Giờ thêm câu lệnh :

exp->val = 10;

Kết quả : Chương trình bị crash.

=> Con trỏ null có thể gọi phương thức nhưng không thể thay đổi data member

4. Undefine behavior

Có thể hiểu là việc thực hiện chương trình mà hành vi của nó không được đặc tả trong ngôn ngữ mà trình biên dịch phải tuân thủ. Trong quá trình biên thực hiện mỗi trình biên dịch có thể cho kết quả khác nhau

Một số UB nên chú ý :

  • Thay đổi giá trị của string literal
char* p = " Hello";

p[0] = 'W';
  • Chia cho 0.
  • Truy cập bộ nhớ bên ngoài mảng
int arr[4] = {0, 1 , 2 ,3};

int* p = arr + 5;
  • Thay đổi giá trị biến nhiều lần trong cùng biểu thức, không xác định được thứ tự thực hiện.
i = i++  + 1;

a[i] = i++;

Leave A Comment?