Có một vấn đề thực sự tinh tế. Có một lớp được biên dịch với trình biên dịch MS + 2013 C++, cho nền tảng 32 bit có kích thước 4 byte. Con trỏ hàm có sizeof 4 byte. Nhưng khi lớp này được biên dịch với trình biên dịch này nhưng được đưa vào dự án khác nhau để tạo ra thư viện, cũng nhắm tới nền tảng 32 bit, thì lớp đó có con trỏ * m_Function chiếm 16 byte! Tất nhiên, khi tôi instantiating lớp này từ dự án chính nó nghĩ rằng lớp chiếm 4 byte và phân bổ kích thước bộ nhớ rất, trong khi trong thực tế nó chiếm 16 byte và gây ra overruns bộ nhớ.Kích thước của con trỏ đến chức năng thành viên khác nhau như điên
class CC1
{
public:
CC1();
void (CC1:: *m_Function)();
};
Tôi biết rằng kích thước hàm từ con trỏ đến thành viên có thể thay đổi. Nhưng qustion là - thiết lập trình biên dịch nào kiểm soát điều này? Tôi không quan tâm là nó 4 hoặc 16 byte - chỉ cần chúng giống nhau. Cấu trúc thiết lập căn chỉnh thành viên là như nhau cho cả hai dự án./vmm/vmg tùy chọn? Không đề cập đến chúng trong cài đặt trình biên dịch trong cả hai dự án.
Nhân tiện, tôi đã thử xây dựng cho mục tiêu x64 và trong trường hợp này sizeof * m_Function luôn là 8 byte, từ dự án chính và libray.
Cảm ơn bạn.
http://blogs.msdn.com/b/oldnewthing/archive/2004/02 /09/70002.aspx – Lectral
Bạn đang xây dựng theo cùng một cách (gỡ lỗi IE và phát hành)? – NathanOliver
có thể là các cài đặt xây dựng khác nhau (căn chỉnh, thông tin gỡ lỗi, v.v ...) –