Tôi biết rằng memset được cau mày khi khởi tạo class
. Ví dụ, một cái gì đó như sau:Làm thế nào để thực hiện tương đương với memset (điều này, ...) mà không có clobbering vtbl?
class X { public:
X() { memset(this, 0, sizeof(*this)) ; }
...
} ;
sẽ clobber các vtbl
nếu có một chức năng virtual
trong hỗn hợp.
Tôi đang làm việc trên một codebase cũ (humongous) là C-ish nhưng được biên dịch bằng C++, vì vậy tất cả các thành viên được đề cập thường là POD và không yêu cầu các nhà xây dựng C++ truyền thống. Việc sử dụng C++ dần dần leo lên (như các hàm ảo), và điều này khiến các nhà phát triển không nhận ra rằng memset có những hàm răng C++ bổ sung này.
Tôi tự hỏi nếu có một cách an toàn C++ để thực hiện khởi tạo không bắt đầu tất cả bằng không, có thể được theo sau bởi khởi tạo thành viên cụ thể khi khởi tạo không phù hợp?
Tôi tìm thấy các câu hỏi tương tự memset for initialization in C++ và zeroing derived struct using memset. Cả hai đều có "không sử dụng memset()" câu trả lời, nhưng không có lựa chọn thay thế tốt (đặc biệt là cho các cấu trúc lớn có khả năng chứa nhiều thành viên nhiều).
Thông thường bạn lấy địa chỉ của trường đầu tiên và xóa từ đó. Không nghi ngờ điều này vi phạm một số quy tắc, nhưng nó luôn luôn làm việc cho tôi. –
Tùy chọn khác là viết thói quen phân bổ của riêng bạn cho lớp, vì vậy bạn có thể đảm bảo không gian được xóa, nhưng IIRC có những hạn chế xung quanh đó. –
Bạn không có nghĩa là 'memset (this, 0, sizeof * this)'? (Và vâng, điều đó cũng sẽ che dấu vtbl.) –