Tôi có một bãi chứa sự cố mà tôi đang cố phân tích (VC++ 2010).Phương pháp std :: bản đồ nào giống hệt nhau (và có thể chia sẻ biểu tượng) bất kể tham số mẫu là gì?
Sau đó tôi có một callstack trông như thế này (tôi đã cắt rất nhiều ở đây cho dễ đọc):
myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructB,std::less<unsigned int> ... >::_Erase(...)
myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructA,std::less<unsigned int>,... >::clear()
(clear() gọi _Erase())
Lưu ý sự khác biệt trong tham số mẫu của giá trị (StructA vs. StructB). Bây giờ, tôi biết các phương thức khác nhau có cùng một nhị phân có thể có cùng biểu tượng trong PDB mặc dù chúng thực sự sử dụng mã khác nhau. Tôi giả định đây là trường hợp ở đây (std :: map :: _ Erase là như nhau không có vấn đề loại giá trị).
Nhưng làm sao tôi biết? Có một danh sách các phương pháp STL (cho việc thực hiện MS này) mà nó áp dụng? Có thể đó là một loại lỗi nào đó không?
Cập nhật:
Nhìn vào PDB (trong một trình soạn thảo văn bản), tôi thấy nhiều std :: map < ...> :: _ Erase, và đặc biệt là tôi thấy họ cho cả StructA và StructB. Tôi không biết nếu nó có nghĩa là bất cứ điều gì về gấp.
Ngoài ra, mã đã tháo rời của std :: map hiển thị cuộc gọi đến một địa chỉ được hiểu là std :: map. Tôi đoán mã này có nghĩa là gấp ...
Có thể nếu bạn mở tập tin exe/dll của mình với bộ khung phụ thuộc, bạn có thể tìm thấy tất cả các ký hiệu _Erase và xem liệu có thực sự là hai hay không. Tôi không bao giờ cố gắng kiểm tra nó bản thân mình, vì vậy tôi không thể nói từ kinh nghiệm nếu điều này sẽ hữu ích trong trường hợp này. – selalerer