2010-10-19 15 views
6

Trong khi gỡ lỗi một trong các lõi của chương trình, tôi đã xem qua kịch bản mà đối tượng chứa của nó là đa hình mất VPTr của nó và tôi có thể nhìn thấy nó trỏ đến NULL.Tại sao đối tượng C++ của tôi mất VPTr

Điều gì có thể xảy ra khi đối tượng mất VPTr.

Cảm ơn trước, Brijesh

+0

đối tượng này có triển khai ít nhất một hàm 'ảo' không? ngay cả khi nó không, có rất ít cơ hội rằng vptr sẽ là 'NULL' vì nó thường được sử dụng để lưu trữ' typeinfo'. –

+0

Bạn có chắc chắn rằng bộ nhớ đang được làm sạch? Có thể là do [hành vi này] (http://www.artima.com/cppsource/nevercall.html) mà bạn đã triển khai. – Keynslug

+0

Bạn có toàn bộ phạm vi của _Undefined Behavior_ để chọn từ - và đó là rất nhiều. – sbi

Trả lời

6
  1. Ký ức đã được cho vào thùng rác, ví dụ: một cái gì đó ghi đè lên bộ nhớ.

  2. Bạn đã hủy nó bằng cách gọi xóa hoặc bằng cách gọi trực tiếp trình hủy. Điều này thường không NULL ra vptr, nó sẽ chỉ kết thúc có nó trỏ đến vtable của lớp cơ sở, nhưng điều đó phụ thuộc vào việc thực hiện của bạn.

Nhiều khả năng, trường hợp 1. Nếu bạn có một trình gỡ lỗi có breakpoint bộ nhớ và nếu bạn có thể tạo lại vấn đề đáng tin cậy, thiết lập một breakpoint bộ nhớ trên vptr và xem những gì đang sửa đổi nó.

5

Có thể có gì đó đã ghi đè toàn bộ đối tượng. Một cái gì đó như thế này:

memset(object, 0, sizeof(*object)); 

cho đến khi nó được sử dụng trên đối tượng có vptr.

+0

Cấu trúc này không được sử dụng trên bất kỳ lớp nào có dữ liệu không phải POD, không chỉ các lớp có bảng v. – CashCow

0

Có thể bạn đang cố gắng sử dụng bảng v trong khi hủy đối tượng của bạn. Bảng v không khả dụng tại thời điểm này.