Kiểm tra sự trở lại của malloc
không giúp bạn nhiều bởi chính nó để làm cho phân bổ của bạn an toàn hơn hoặc ít bị lỗi hơn. Nó thậm chí có thể là một cái bẫy nếu đây là thử nghiệm duy nhất mà bạn thực hiện.
Khi được gọi với đối số là 0
, tiêu chuẩn cho phép malloc
trả về một loại địa chỉ duy nhất, không phải là con trỏ rỗng và bạn không có quyền truy cập. Vì vậy, nếu bạn chỉ kiểm tra xem sự trở lại là 0
nhưng không kiểm tra các đối số cho malloc
, calloc
hoặc realloc
bạn có thể gặp phải một sự xâm nhập sau này.
Tình trạng lỗi này (bộ nhớ cạn kiệt) khá hiếm trong môi trường "được lưu trữ". Thông thường bạn đang gặp rắc rối lâu trước khi bạn gặp rắc rối với loại lỗi này. (Nhưng nếu bạn đang viết thư viện thời gian chạy, là một hacker hạt nhân hoặc tên lửa xây dựng này là khác nhau, và có các thử nghiệm làm cho cảm giác hoàn hảo.)
Mọi người sau đó có xu hướng trang trí mã của họ với điều kiện lỗi phức tạp mà span dòng, làm perror
và các nội dung tương tự, có thể ảnh hưởng đến khả năng đọc của mã.
Tôi nghĩ rằng điều này "kiểm tra sự trở lại của malloc
" được đánh giá quá cao, đôi khi thậm chí còn bảo vệ khá một cách giáo điều. Những thứ khác quan trọng hơn nhiều:
- luôn khởi tạo biến luôn. đối với các biến con trỏ, điều này rất quan trọng, để chương trình gặp sự cố độc đáo trước khi mọi thứ trở nên quá tệ. thành viên con trỏ chưa được khởi tạo trong
struct
s là nguyên nhân quan trọng của các lỗi khó tìm.
- luôn kiểm tra đối số
malloc
và Co. nếu đây là biên dịch hằng số thời gian như sizof toto
không có vấn đề gì, nhưng luôn đảm bảo phân bổ véc tơ của bạn xử lý đúng trường hợp 0.
Một điều dễ dàng để kiểm tra trả lại malloc
là kết thúc bằng một cái gì đó như memset(malloc(n), 0, 1)
. Điều này chỉ viết một 0
trong byte đầu tiên và treo độc đáo nếu malloc
gặp lỗi hoặc n
là 0
để bắt đầu.
Nguồn
2011-10-30 22:32:56
Tôi nghĩ rằng bạn không nên sử dụng malloc trong C++: http://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new – lc2817
@ lc2817 bạn chỉ nên sử dụng malloc nếu bạn đang viết mã với giao diện C (tức là các hàm được sử dụng từ C nhưng được viết bằng C++) ** và ** mã C chịu trách nhiệm giải phóng bộ nhớ đó. –
@WTP cảm ơn độ chính xác này. Mặc dù, tôi không biết nếu đó là trường hợp ở đây. – lc2817