Masz naprawdę subtelny problem. Mam klasę kompilowaną przy kompilatorze MS VS 2013 C++, dla platform 32-bitowych ma rozmiar 4 bajty. Wskaźnik funkcji ma rozmiar 4 bajty. Ale kiedy ta klasa jest kompilowana z tym samym kompilatorem, ale włączona do innego projektu do produkcji biblioteki, również ukierunkowana na platformę 32-bitową, wtedy klasa ma wskaźnik * m_Function zajmujący 16 bajtów! Oczywiście, gdy tworzę instancję tej klasy z głównego projektu, uważa ona, że klasa zajmuje 4 bajty i przydziela ten właśnie rozmiar pamięci, podczas gdy w rzeczywistości zajmuje 16 bajtów i powoduje przepełnienie pamięci.Rozmiar wskaźnika do funkcji elementu zmienia się jak szalony
class CC1
{
public:
CC1();
void (CC1:: *m_Function)();
};
Wiem, że rozmiar funkcji wskaźnika do członka może się różnić. Ale qustion jest - które ustawienie kompilatora kontroluje to? Nie obchodzi mnie to, czy to 4 czy 16 bajtów - po prostu muszą być takie same. Ustawienia wyrównania elementów konstrukcyjnych są takie same dla obu projektów./vmm/vmg opcje? Brak wzmianki o nich w ustawieniach kompilatora w obu projektach.
Przy okazji, próbowałem budować dla celu x64 iw tym przypadku sizeof * m_Function ma zawsze 8 bajtów, z projektu głównego i libray.
Dziękuję.
http://blogs.msdn.com/b/oldnewthing/archive/2004/02 /09/70002.aspx – Lectral
Czy budujesz w ten sam sposób (IE debug vs release)? – NathanOliver
Prawdopodobnie różne ustawienia kompilacji (wyrównanie, informacje debugowania, itp.) –