Đặt con trỏ về NULL
sau free
là một thực tiễn đáng ngờ thường được phổ biến như một quy tắc "lập trình tốt" trên một tiền đề sai lầm rõ ràng. Đó là một trong những sự thật giả thuộc về loại "âm thanh đúng" nhưng trong thực tế đạt được hoàn toàn không có gì hữu ích (và đôi khi dẫn đến hậu quả tiêu cực).
Bị cáo buộc, đặt một con trỏ thành NULL
sau free
được cho là để ngăn chặn vấn đề "gấp đôi miễn phí" đáng sợ khi cùng một giá trị con trỏ được truyền đến free
nhiều lần. Tuy nhiên, trong thực tế, trong 9 trường hợp, 10 vấn đề thực sự "miễn phí kép" xảy ra khi các đối tượng con trỏ khác nhau có cùng giá trị con trỏ được sử dụng làm đối số cho free
. Không cần phải nói, thiết lập một con trỏ đến NULL
sau khi free
đạt được hoàn toàn không có gì để ngăn chặn vấn đề trong những trường hợp như vậy.
Tất nhiên, có thể gặp vấn đề "nhân đôi miễn phí" khi sử dụng cùng một đối tượng con trỏ làm đối số free
. Tuy nhiên, trong các tình huống thực tế như thế thường chỉ ra một vấn đề với cấu trúc logic chung của mã, chứ không phải là "miễn phí kép" ngẫu nhiên. Một cách thích hợp để xử lý vấn đề trong các trường hợp như vậy là xem xét và suy nghĩ lại về cấu trúc của mã để tránh tình huống khi cùng một con trỏ được truyền đến free
nhiều lần. Trong những trường hợp như vậy, đặt con trỏ đến NULL
và xem xét vấn đề "đã sửa" không gì khác hơn là một nỗ lực để quét vấn đề dưới thảm. Nó chỉ đơn giản là không hoạt động trong trường hợp chung, bởi vì vấn đề với cấu trúc mã sẽ luôn tìm cách khác để tự thể hiện.
Cuối cùng, nếu mã của bạn được thiết kế đặc biệt để dựa vào giá trị con trỏ là NULL
hay không NULL
, việc đặt giá trị con trỏ thành NULL
sau là hoàn toàn tốt free
. Nhưng như một quy tắc "thực hành tốt" chung (như trong "luôn đặt con trỏ của bạn thành NULL
sau free
"), một lần nữa, nó là một giả mạo nổi tiếng và khá vô dụng, thường được theo sau bởi một số lý do hoàn toàn tôn giáo, giống như tôn giáo.
ptr == NULL
trước khi làm bất cứ điều gì với nó. Nếu bạn không vô hiệu hóa các con trỏ miễn phí của mình, bạn vẫn nhận đượcptr != NULL
nhưng con trỏ vẫn không sử dụng được.