C++ Nâng Cao. Sự Khác nhau giữa new và malloc

Hi. chào mừng các bạn đến với chủ đề học lập trình c++ nâng cao.

Hôm nay chúng ta cùng tìm hiểu về sự khác nhau giữa:  new trong c++ và malloc trong c.

Nếu nhưng trong c việc cấp phát bộ nhớ động được sử dụng bởi cơ chế malloc,

thì trong c++ được thay thế bằng cách sử dụng new.

Về cơ bản, hai phương thức này đều có mục đích đó là cấp phát một vùng nhớ theo số lượng cho phép của người lập trình viên.

Tuy nhiên hai phương thức này cũng có những điểm khác nhau như sau:

1. Gọi đến hàm khởi tạo.

Khi sử dụng new để cấp phát một vùng nhớ ảo, thì nó sẽ gọi đến hàm khởi tạo của lớp đối tượng được cấp phát.

Nhưng malloc thì không có cơ chế này.

Một điểm thú vị cho thấy, thực tế kể cả các kiểu dữ liệu thuần túy như int, char, float, chúng ta đều có thể sử dụng new và khởi tạo ngay một giá trị ban đầu cho nó giống như việc cấp phát cho các đối tượng khác.

Hãy cùng xem ví dụ minh họa sau đây.

Ví dụ bạn có một class là phân số, và bạn có một hàm khởi tạo ban đầu là cho phép truyền vào hai giá trị tử số và mẫu số

class PhanSo
{
private:
  int a_;
  int b_;
public:
  PhanSo() {;}
  PhanSo(const int& a, const int& b)
  {
    a_ = a;
    b_ = b;
  }
};

void main()
{
  PhanSo* p_ps = new PhanSo(5, 6);

  _getch();
}

Các kiểu dữ liệu nguyên thủy cũng có thể khởi tạo giá trị trực tiếp như vậy

void main()
{
  int* pInt = new int (10);
  float* pFloat = new float (20.0);
  char* pCh = new char('H');

  std::cout << "val int = " << *pInt;
  std::cout << "\nval float = " << *pFloat;
  std::cout << "\nCharacter = " << *pCh;

  _getch();
}
2. Sự khác nhau về tính chất.

New là một từ khóa, thực chất nó là một toán tử, còn malloc là một hàm. Một hàm sẽ có nhiều thủ tục phức tạp hơn như là, thủ tục khai báo hàm, định nghĩa hàm, đặt địa chỉ hàm trong vùng nhớ, hàm có giá trị trả lại hay không, có đối số đầu vào hay không.

3. Kiểu trả lại sau khi cấp phát

New sẽ trả về chính xác kiểu dữ liệu của vùng nhớ nó vừa cấp phát, ví dụ bạn khai báo cấp phát vùng nhớ int thì nó sẽ trả về kiểu int.

Còn malloc thì trả về con trỏ kiểu void => chúng ta phải ép kiểu cho nó.

4. Vùng nhớ

New sẽ sử dụng các vùng nhớ free store trong bộ nhớ để cấp phát,

trong khi đó malloc lại sử dụng các ô nhớ trong vùng nhớ heap.

5. Khi thất bại

Khi việc cấp phát vùng nhớ thất bại, thì malloc sẽ trả về con trỏ NULL, trong khi new thì sẽ trả về một cảnh báo ngoại lệ.

Thông thường, người ta sử dụng try – cast để bắt ngoại lệ khi cấp phát new mà có nguy cơ thất bại.

6. Cơ chế ghi đè.

Cho phép cơ chế ghi đè với toán tử new, nhưng điều này không thể với hàm malloc

7. Kích thước

Kích thước bộ nhớ yêu cầu cấp phát sẽ được tính toán bởi trình biên dịch khi sử dụng new

Nhưng với malloc thì chúng ta phải tự tính toán bằng thủ công (thường là số lượng cấp phát nhân với kích thước của kiểu dữ liệu với 1 phần tử)

Ok. Đó là những điểm khác biệt giữa việc sử dụng new và malloc

_______________________

Pass

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.