Bu Not CWnd::PostNcDestroy üye işlevini açıklar. Özelleştirilmiş tahsisi CWndyapmak isterseniz bu işlevi kullanın-türetilen nesneler.
Bu notu da Kardinal kural nedenleri açıklar:
DestroyWindow c++ Windows nesne yok etmek için değil de "Sil" kullanın.
Bu önemlidir. Aşağıdaki yönergeleri izleyin, kaç Temizleme sorunları (örneğin, silme/c++ Bellek boşaltmak için unutulması, hwnds gibi sistem kaynakları boşaltmak unutulması veya nesneleri birden çok kez boşaltma) olacaktır.
Sorunu
Windows nesneleri ( CWndtüretilmiş sınıfları), hem bir c++ nesnesi (Uygulama yığın halinde tahsis) hem de bir hwnd (sistem kaynakları pencere yöneticisi tarafından ayrılan) temsil eder. Bir window nesnesi yok etmek için birkaç yöntem olduğundan, bu sistem kaynak önlemek veya uygulama bellek sızıntıları ve bu nesneleri ve Windows işleme birden çok kez yok önlemek bir kurallar kümesi sağlamanız gerekir.
Daha fazla bellek yönetimi sorunu budur. Windows pencere varlığı kullanıcı arabirimi Etkisi: ekranda; çizilmiş bir pencere tahrip bir kez orada bir etki üstünde sistem kaynak. Uygulama adres alanınız c++ bellek sızıntı sistem kaynaklarının sızıntı olarak kötü değil.
Windows yok
Windows nesne yok iki izin yolu vardır:
İlk durumda tarafından çok yaygın olarak kullanılır. DestroyWindow doğrudan kodunuz tarafından çağrılmaz bile bu durum geçerlidir. Kullanıcı doğrudan (varsayılan wm_close davranıştır DestroyWindowaramak için) bir çerçeve penceresi kapandığında bir durumdur ve bir üst pencere yok olduğunda, Windows tüm çocuklar için DestroyWindow çağırır.
İkinci durumda, Windows nesnelerinde Sil işleci kullanımı çok nadir olmalıdır ve yalnızca durumlar aşağıda verilen.
Otomatik temizleme ile CWnd::PostNcDestroy
Windows pencere yok olduğunda, pencereye gönderilen son Windows ileti wm_ncdestroy. Bu mesajı (CWnd::OnNcDestroy) için varsayılan CWnd işleyicisi c++ nesnesi ve sanal PostNcDestroyişlev çağrısı hwnd ayırmak. Bazı sınıfları c++ nesneyi silmek için bu işlevi geçersiz kılar.
CWnd::PostNcDestroy varsayılan uygulanması yığını çerçeveyi tahsis veya diğer nesneleri katıştırılmış pencere nesneler için uygun olan bir şey yok. Bu kendileri tarafından (diğer c++ içinde katıştırılmış değil) öbek üzerindeki tahsis edilecek şekilde tasarlanmıştır penceresindeki nesneler için uygun değil.
Bu sınıfların kendileri tarafından öbek üzerinde tahsis için tasarlanmış bir ""Bu silmegerçekleştirmek için PostNcDestroy üye işlevi geçersiz. Bu ifade, c++ nesnesi ile ilişkilendirilmiş herhangi bir c++ bellek ücretsiz olacaktır. M_hWnd olmayan null ise, varsayılan CWnd yıkıcı DestroyWindow aramalar rağmen müstakil ve null Temizleme aşamasında ele olacağından bu sonsuz özyineleme yol açmaz.
&Notnbsp;CWnd::PostNcDestroy normalde Windows wm_ncdestroy sonra adı verilen mesaj, pencere imha bir parçası olarak işlenir ve hwnd ve c++ window nesnesi artık bağlı. (Otomatik temizleme kuralları için aşağıya bakınız) hatası oluşursa, CWnd::PostNcDestroy çoğu oluşturma aramaları uygulanmasında da çağrılır.
Otomatik Temizleme sınıfları
Aşağıdaki sınıflar, auto-temizleme için tasarlanmamıştır. Normalde diğer c++ nesnesi veya yığın gömülü:
Aşağıdaki sınıflar, auto-temizleme için tasarlanmıştır. Onlar normalde öbek üzerinde kendileri tarafından tahsis edilen:
Bu kurallar birini kırmak istiyorsanız, PostNcDestroy üye işlev türetilmiş sınıfta geçersiz kılmalısınız. Otomatik Temizleme, sınıfa eklemek için sadece temel sınıf çağrı ve bir delete buyapın. Otomatik Temizleme, sınıftan kaldırmak için CWnd::PostNcDestroy doğrudan temel sınıf PostNcDestroy üyesinin yerine doğrudan arama.
En yaygın kullanımı yukarıdaki öbek üzerinde tahsis edilebilecek kalıcı olmayan bir iletişim oluşturmaktır.
Çağrı sil' zaman' için
DestroyWindow, ya da c++ üye işlevi veya genel aramak için Windows nesneyi yok etmek için önerilen yol olduğunu :: DestroyWindow API.
Global deme :: DestroyWindow API bir MDI alt penceresi yok etmek yerine CWnd::DestroyWindow sanal üye işlevini kullanın.
Otomatik temizleme yerine getirmiyor c++ penceresindeki nesneler için silmek yerine DestroyWindow kullanarak DestroyWindow aramak zorunda kalmadan sorunlarını önler CWnd:: ~ CWnd burada vtbl değil işaret için doğru türetilmiş bir sınıf yıkıcı. Böylece mfc Tanılama (hata ayıklama) sürümü ile uyarır bu ince hataları neden olabilir
Uyarı: DestroyWindow CWnd içinde arama:: ~ CWnd
nbsp; OnDestroy ya da Post&NcDestroy türetilmiş sınıf çağrılmaz
Otomatik temizleme yerine c++ Windows nesneleri durumunda, DestroyWindowçağırmalısınız. İşleç silme doğrudan kullanırsanız, mfc Bellek Tanılama ayırıcı, bellek iki kez ( silmek için ilk çağrı) yanı sıra "silmek bu" auto-Temizleme uygulamasında PostNcDestroyve dolaylı çağrı boşaltma uyarır.
DestroyWindow bir otomatik temizleme nesnesini çağıran sonra c++ nesnesi hala etrafında olacak, ama m_hWnd null olacaktır. Otomatik Temizleme nesne üzerinde DestroyWindow çağrıldıktan sonra c++ nesnesi tarafından c++ delete operatörünü PostNcDestroy auto-Temizleme uygulanmasında gitmiş, olacak..
Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre