Neden 0x0C
daha yaygın göründüğü gibi 0x08
(gerçekten mi? Bilmiyorum; ve ne tür uygulamalarda?) Bunun sanal yöntem tablosu işaretçileriyle ilgisi olabilir. Bu gerçekten bir yorum (vahşi kütle tahminde :), ama biraz daha büyük, işte böyle 0x04
. Örneğin, başka bir sanal sınıftan miras alan bir sınıf şöyle bir bellek düzenine sahip olabilir:
0x00 - VMT pointer for parent
0x04 - Field 1 in parent
0x08 - VMT pointer for child
0x0C - Field 1 in child
Bu ortak bir senaryo mu, hatta yakın mı? Emin değilim. Bununla birlikte, 64 bitlik bir uygulamada bunun daha da ilginç bir şekilde 0x0C
değere kaymasının olabileceğini unutmayın :
0x00 - VMT parent
0x08 - Field 1 parent
0x0C - VMT child
0x14 - Field 2 child
Bu yüzden aslında boş göstergelerdeki ofsetlerde uygulamaların önemli örtüşme olabileceği bir çok durum var. Bu, bir alt sınıftaki ilk alan veya sanal yöntem tablosu işaretçisi olabilir - bir örnekte herhangi bir sanal yöntemi çağırdığınızda gerekli, böylece bir null
işaretçi üzerinde sanal bir yöntem çağırıyorsanız , erişim ihlali alırsınız. VMT ofseti. Bu özel değerin yaygınlığı daha sonra benzer bir kalıtım düzenine sahip bir sınıf veya belirli bir arayüz (DirectX oyunları gibi bazı uygulama sınıfları için oldukça mümkün) olan belirli bir arayüz sağlayan bazı ortak API ile ilgili olabilir. Bunun gibi bazı basit ortak nedenleri takip etmek mümkün olabilir, ancak oldukça hızlı bir şekilde değişiklik yapmayan uygulamalardan kurtulma eğilimindeyim, bu yüzden ...
0000000C
olduğu yolu daha yaygın00000008
, ancak cevapların hiçbiri adresine görünüyor hiç: /