Tôi có một mã mà tôi sử dụng một con trỏ để truy cập vào một số datablock. Trong một số trường hợp hiếm hoi, một vài thành viên của datablock trống, và kết quả là con trỏ trở nên lơ lửng. Trong thực tế, tôi có được con trỏ chính xác nhưng chương trình bị treo khi cố gắng làm điều gì đó với con trỏ.Có cách nào để kiểm tra xem con trỏ có đang lơ lửng không?
Lời khuyên thông thường là tránh loại sử dụng này. Nhưng thật đáng buồn, khuôn khổ tôi sử dụng yêu cầu tôi sử dụng loại phương pháp truy cập dữ liệu này.
Có cách nào tôi có thể "kiểm tra" nếu con trỏ không hợp lệ trước khi thực hiện bất kỳ thao tác nào với nó? Kiểm tra rằng con trỏ không bằng NULL đã không hoạt động, rõ ràng. Tôi cũng đã thử điều này:
try
{
CString csClassName = typeid(*pMyPointer).name(); // Check error condition
// The line below fails due to dangling pointer (data block is not valid).
hr = pMyPointer->MyPointerMethod();
}
catch(bad_typeid)
{
return E_FAIL;
}
catch(...)
{
return E_FAIL;
}
Đây có phải là cách chính xác không?
Con trỏ của tôi phải tĩnh đối với lớp .. có ổn không nếu tôi sử dụng con trỏ thông minh? – Nikhil
Không có vấn đề gì cả. Bạn cần phải xem ra các vấn đề an toàn chủ đề nhưng đó là không có khác nhau cho một con trỏ thông minh vs một con trỏ thô. –
Tôi không nghĩ nó quan trọng. Điều duy nhất làm phiền tôi là liệu khuôn khổ của bạn có thể tự làm cho con trỏ của bạn lúng túng mà không cần thông báo trước. Hãy xem, bạn sẽ phải giải nén con trỏ thô ra khỏi con trỏ thông minh và chuyển nó vào khung công tác của bạn. Nếu nó đảm bảo rằng con trỏ sẽ vẫn còn hiệu lực sau khi cuộc gọi, hoặc bạn sẽ được thông báo nếu nó trở thành không hợp lệ - tốt, đi cho nó. – Septagram