So sánh C và C++
- C: dùng
malloc/callocđể cấp phát,freeđể giải phóng. - C++: dùng
newđể cấp phát,deletehoặcdelete[]để giải phóng
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 5; // số phần tử cần cấp phát
// malloc/calloc cấp phát vùng nhớ cho n phần tử kiểu int, sẽ trả về NULL nếu không cấp phát được bộ nhớ
int *arr = (int*) malloc(n * sizeof(int));
if (arr == NULL) {
printf("Không đủ bộ nhớ!\n");
return 1;
}
// khởi tạo giá trị thủ công
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
printf("C (malloc): ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
free(arr); // giải phóng vùng nhớ
return 0;
}
C (malloc): 1 2 3 4 5#include <iostream>
using namespace std;
int main() {
int n = 5; // số phần tử cần cấp phát
int *arr = nullptr;
try {
// new cấp phát vùng nhớ cho n phần tử kiểu int, nếu thất bại sẽ ném std::bad_alloc
arr = new int[n];
} catch (bad_alloc &e) {
cout << "Không đủ bộ nhớ!\n";
return 1;
}
// khởi tạo giá trị
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
cout << "C++ (new): ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
delete[] arr; // giải phóng vùng nhớ
return 0;
}
C++ (new): 1 2 3 4 5malloc vs calloc
Trong C, cả malloc và calloc đều dùng để cấp phát bộ nhớ động, nhưng chúng có một vài điểm khác biệt quan trọng
malloc thường nhanh hơn vì không cần gán giá trị ban đầu, nhưng calloc tiện lợi khi muốn vùng nhớ sạch (tránh lỗi do giá trị rác).
calloc = malloc + memset(arr, 0, n * sizeof(int)); // khởi tạo toàn bộ vùng nhớ về 0
| Hàm | Cách dùng | Khởi tạo bộ nhớ | Tham số | Trả về |
|---|---|---|---|---|
malloc | ptr = (int*) malloc(n * sizeof(int)); | Không khởi tạo, vùng nhớ chứa giá trị rác | 1 tham số: tổng số byte cần cấp phát | Con trỏ tới vùng nhớ |
calloc | ptr = (int*) calloc(n, sizeof(int)); | Khởi tạo toàn bộ vùng nhớ về 0 | 2 tham số: số phần tử và kích thước mỗi phần tử | Con trỏ tới vùng nhớ |
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 5; // số phần tử cần cấp phát
// malloc cấp phát n * sizeof(int) byte, nhưng KHÔNG khởi tạo giá trị
int *arr = (int*) malloc(n * sizeof(int));
printf("malloc: ");
for(int i=0; i<n; i++) {
// do chưa khởi tạo, giá trị ở đây là "rác" (ngẫu nhiên trong bộ nhớ)
printf("%d ", arr[i]);
}
free(arr); // giải phóng vùng nhớ đã cấp phát
return 0;
}
malloc: 32767 -12345 0 42 9999#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 5; // số phần tử cần cấp phát
// calloc cấp phát n phần tử, mỗi phần tử có kích thước sizeof(int)
int *arr = (int*) calloc(n, sizeof(int));
printf("calloc: ");
for(int i=0; i<n; i++) {
// tất cả giá trị đều là 0 vì calloc đã khởi tạo
printf("%d ", arr[i]);
}
free(arr); // giải phóng vùng nhớ đã cấp phát
return 0;
}
calloc: 0 0 0 0 0