Có, có vấn đề với con trỏ. Rất có thể bạn đang sử dụng một thiết bị không được khởi tạo đúng cách, nhưng cũng có thể bạn đang làm rối tung việc quản lý bộ nhớ của mình với giải phóng kép hoặc một số thứ như vậy.
Để tránh con trỏ chưa được khởi tạo dưới dạng biến cục bộ, hãy thử khai báo chúng càng muộn càng tốt, tốt nhất là (và điều này không phải lúc nào cũng có thể thực hiện được) khi chúng có thể được khởi tạo với một giá trị có nghĩa. Thuyết phục bản thân rằng chúng sẽ có giá trị trước khi được sử dụng, bằng cách kiểm tra mã. Nếu bạn gặp khó khăn với điều đó, hãy khởi tạo chúng thành hằng số con trỏ null (thường được viết là NULL
hoặc 0
) và kiểm tra chúng.
Để tránh các con trỏ chưa được khởi tạo dưới dạng giá trị thành viên, hãy đảm bảo rằng chúng được khởi tạo đúng cách trong hàm tạo và được xử lý đúng cách trong các hàm tạo sao chép và toán tử gán. Đừng dựa vào một init
chức năng để quản lý bộ nhớ, mặc dù bạn có thể khởi tạo khác.
Nếu lớp của bạn không cần các hàm tạo bản sao hoặc toán tử gán, bạn có thể khai báo chúng dưới dạng các hàm thành viên riêng và không bao giờ định nghĩa chúng. Điều đó sẽ gây ra lỗi trình biên dịch nếu chúng được sử dụng rõ ràng hoặc ngầm định.
Sử dụng con trỏ thông minh khi có thể. Lợi thế lớn ở đây là, nếu bạn kiên trì và sử dụng chúng một cách nhất quán, bạn hoàn toàn có thể tránh viết delete
và không có gì bị xóa hai lần.
Sử dụng chuỗi C ++ và các lớp vùng chứa bất cứ khi nào có thể, thay vì các chuỗi và mảng kiểu C. Cân nhắc sử dụng .at(i)
thay vì sử dụng [i]
, bởi vì điều đó sẽ buộc kiểm tra giới hạn. Xem liệu trình biên dịch hoặc thư viện của bạn có thể được đặt để kiểm tra giới hạn hay không [i]
, ít nhất là trong chế độ gỡ lỗi. Các lỗi phân đoạn có thể được gây ra bởi các lần ghi đè bộ đệm ghi rác lên các con trỏ hoàn toàn tốt.
Làm những điều đó sẽ làm giảm đáng kể khả năng xảy ra lỗi phân đoạn và các vấn đề về bộ nhớ khác. Chắc chắn họ sẽ không thể sửa chữa mọi thứ, và đó là lý do tại sao bạn nên sử dụng valgrind ngay bây giờ và sau đó khi bạn không gặp vấn đề, và valgrind và gdb khi bạn làm vậy.
g
trong bối cảnhCMake
?