Nếu bạn không biết kích thước chính xác của bộ nhớ bạn cần sử dụng, bạn cần cấp phát động ( malloc
). Ví dụ có thể là khi người dùng mở một tệp trong ứng dụng của bạn. Bạn sẽ cần đọc nội dung của tệp vào bộ nhớ, nhưng tất nhiên bạn không biết trước kích thước của tệp, vì người dùng chọn tệp tại chỗ, trong thời gian chạy. Vì vậy, về cơ bản bạn cần malloc
khi không biết trước kích thước dữ liệu mà bạn đang làm việc. Ít nhất đó là một trong những lý do chính để sử dụng malloc
. Trong ví dụ của bạn với một chuỗi đơn giản mà bạn đã biết kích thước tại thời điểm biên dịch (cộng với việc bạn không muốn sửa đổi nó), sẽ không có ý nghĩa gì khi phân bổ động chuỗi đó.
Hơi lạc đề, nhưng ... bạn phải hết sức cẩn thận để không tạo rò rỉ bộ nhớ khi sử dụng malloc
. Hãy xem xét mã này:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
// Do some stuff
if ( /* some error occured */ ) return -1;
// Do some other stuff
free(someMemory);
return result;
}
Bạn có thấy điều gì sai với mã này không? Có một câu lệnh trả về có điều kiện giữa malloc
và free
. Thoạt nghe có vẻ ổn, nhưng hãy nghĩ về nó. Nếu có lỗi, bạn sẽ quay lại mà không cần giải phóng bộ nhớ đã cấp. Đây là một nguồn rò rỉ bộ nhớ phổ biến.
Tất nhiên đây là một ví dụ rất đơn giản và bạn rất dễ thấy lỗi ở đây, nhưng hãy tưởng tượng hàng trăm dòng mã rải rác với con trỏ, malloc
s, free
s và tất cả các loại xử lý lỗi. Mọi thứ có thể trở nên lộn xộn rất nhanh. Đây là một trong những lý do tôi thích C ++ hiện đại hơn C trong các trường hợp áp dụng, nhưng đó là một chủ đề hoàn toàn khác.
Vì vậy, bất cứ khi nào bạn sử dụng malloc
, hãy luôn đảm bảo rằng bộ nhớ của bạn có khả năng hoạt động free
tốt nhất có thể.
malloc()
có thể thất bại!