Trong C++, khi muốn tạo một đối tượng mới, chúng ta phải tạo một khối bộ nhớ trong heap, sau đó gọi constructor để khởi tạo khối bộ nhớ đó. Chúng ta có thể tạo phần tử bộ nhớ bằng từ khóa new. Toán tử new này thực hiện hai nhiệm vụ liên tiếp. Nhưng operator new chỉ tạo không gian bộ nhớ thô.
Từ khóa new
Toán tử new là một loại toán tử đặc biệt, biểu thị yêu cầu cấp phát bộ nhớ trên khu vực heap. Khi có đủ bộ nhớ, toán tử new mới khởi tạo bộ nhớ cho biến con trỏ. Khi tạo đối tượng bằng từ khóa new thông thường, nó thực hiện hai nhiệm vụ liên tiếp:
- Cấp phát khối bộ nhớ cho đối tượng vào heap
- Gọi constructor để khởi tạo khối bộ nhớ
Mã ví dụ
#include <iostream>
using namespace std;
class Box {
public:
Box() {
cout << "Constructor được gọi!" << endl;
}
};
int main() {
Box* myBox = new Box;
}
Kết quả đầu ra
Constructor được gọi!
Operator new
operator new là một hàm. Hàm này dùng để nạp chồng toán tử new. Sử dụng nó, chúng ta có thể cấp phát khối bộ nhớ thô (raw memory). Khái niệm này tương tự như hàm malloc() hoặc calloc(). Hàm này không gọi constructor, do đó bộ nhớ không được khởi tạo. Tuy nhiên, sau khi trả về con trỏ từ phương thức nạp chồng này, trình biên dịch sẽ gọi constructor sau đó.
Mã ví dụ
#include <iostream>
#include <cstdlib>
using namespace std;
class Box {
public:
Box() {
cout << "Constructor được gọi!" << endl;
}
void *operator new(size_t size) {
cout << "Gọi Operator New" << endl;
void *p = malloc(size);
return p;
}
};
int main() {
Box* myBox = new Box;
}
Kết quả đầu ra
Gọi Operator New Constructor được gọi!