Trường hợp tầm thường mà bạn hiển thị có thể được phát hiện tại thời điểm biên dịch, bởi vì việc khởi tạo và phá hủy đối tượng nằm trong cùng một phạm vi. Nói chung, việc xóa không có trong cùng một phạm vi, hoặc thậm chí cùng một tệp nguồn, như là khởi tạo. Và kiểu con trỏ C ++ không mang thông tin về việc nó tham chiếu một đối tượng duy nhất thuộc loại đó hay mảng, chứ chưa nói đến sơ đồ phân bổ. Vì vậy, không thể chẩn đoán điều này tại thời gian biên dịch nói chung.
Tại sao không chẩn đoán các trường hợp đặc biệt có thể?
Trong C ++, đã có các công cụ xử lý rò rỉ tài nguyên động được gắn với phạm vi, cụ thể là con trỏ thông minh và mảng cấp cao hơn ( std::vector
).
Ngay cả khi bạn sử dụng đúng delete
hương vị, mã của bạn vẫn không ngoại lệ an toàn. Nếu mã giữa new[]
và delete[]
kết thúc bằng một lối thoát động, việc xóa không bao giờ thực hiện.
Theo như phát hiện trong thời gian chạy, Valgrind
công cụ thực hiện tốt công việc phát hiện điều này vào thời gian chạy. Đồng hồ đeo tay:
==26781== Command: ./a.out
==26781==
==26781== Mismatched free() / delete / delete []
==26781== at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==26781== by 0x8048498: main (in /home/kaz/test/a.out)
==26781== Address 0x4324028 is 0 bytes inside a block of size 80 alloc'd
==26781== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==26781== by 0x8048488: main (in /home/kaz/test/a.out)
Tất nhiên, Valgrind không chạy trên tất cả các nền tảng và không phải lúc nào cũng thực tế hoặc có thể tái tạo tất cả các tình huống trong thời gian chạy theo công cụ.