(Borland Delphi) Ben genel bir sorun olduğunu düşünüyorum için genel bir çözüm gerek diğer nesneler, ...). Tüm bu referansları takip etmenin iyi bir yolu var, böylece nesne yok edildiğinde onları güncelleyebilirim? Bir nesneye yapılan referanslar nasıl takip edilir? Belirli bir anda</p> <p>bir nesne birden fazla yerden (listelerinden başvurulabilir: manuel bellek ayırma ve işaretçi hala kural bir dünyada
cevap
Diğer değişikliklerden haberdar etmek isterseniz, "Observer Pattern"'u uygulamalısınız. Delphi zaten TComponent torunları için bunu yaptı. TComponent.FreeNotification yöntemini çağırabilir ve diğer bileşen yok olduğunda nesneyiniz bildirilebilir. Bildirim yöntemini çağırarak yapar. TComponent.RemoveFreeNotification'ı çağırarak bildirim listesinden kendinizi kaldırabilirsiniz. Ayrıca bkz. this page.
Çoğu Çöp Toplayıcısı, başvuruların bir listesini almanıza izin vermez, bu nedenle bu durumda yardımcı olmazlar.Arayüzler kullanırsanız Delphi referans sayımı yapabilir, ancak yine referansları kendiniz izlemeniz gerekir.
Bunu neden yapmak istediğinizi tam olarak anlayamıyorum. Elbette kullanmadan önce Nil’de değil referansı mı kontrol edeceksin?
Anwyays, ben dikkate alacağını iki olası çözümler şunlardır:
- nesneleri yöneticisi kendi referans sayıları var.
- Bir referans sayma yöneticisi sınıfı oluşturun.
Muhtemelen AddRef() ve ReleaseRef() işlevlerini, yönetici veya referans olarak bilinen sınıfa eklerim. Daha sonra herhangi bir noktada kaç referansın mevcut olduğunu kontrol etmek için bunları kullanabilirsiniz. COM böyle yapar.
Referansla ilgili sınıf, yalnızca kendi referans sayısını yönetirdi. Yönetici, sayıları saymak için işaretçileri ilişkilendirmek üzere bir Harita kullanabilir.
Nesneye başvuruda bulunanları takip etmeye mi çalışıyorsunuz, böylece nesne yok edildiğinde bu referansları temizleyebilir veya nesneyi yok etmenin güvenli olduğu zamanı takip etmeye mi çalışıyorsunuz? İkincisi o zaman bir çöp toplayıcı arıyormuş gibi geliyorsa. Delphi ile hiç ilgilenmedim, o yüzden kullanabileceğin GC'ler olup olmadığını bilmiyorum, ama olmasaydım şaşırırdım. Eğer eski bir GC ise muhtemelen yardımcı olmazsa. Delphi OOP/kalıtım (bu olursa dürüst bilmiyorum) destekliyorsa, bu (pseudocode) gibi bir şey yapabileceğini:
// Anything that will use one of your tracked objects implements this interface
interface ITrackedObjectUser {
public void objectDestroyed(TrackedObject o);
}
// All objects you want to track extends this class
class TrackedObject {
private List<ITrackedObjectUser> users;
public void registerRef(ITrackedObjectUser u) {
users.add(u);
}
public void destroy() {
foreach(ITrackedObjectUser u in users) {
u.objectDestroyed(this);
}
}
}
Temel olarak, bu toplama olur bir koleksiyona izlenen nesnelerden birini eklediğinizde kendisini bu nesneye kaydedin. Nesne yok edildiğinde (nesnenin yıkıcısında destroy() öğesini çağırdığınızı düşünürsünüz), nesne koleksiyonun imha edildiğini gösterir, böylece koleksiyon ne gerekiyorsa onu yapabilir.
Ne yazık ki, yerleşik koleksiyonları kullanmak istiyorsanız, bu gerçekten iyi bir çözüm değildir. Kendi koleksiyon nesnelerini yazmanız gerekecek (sadece inşa edebilecekleri şeyler yapabilirler). Ve nesneyi izlemek istediğiniz her yere kayıt olduğunuzdan emin olmanız gerekir. “Mutlu” bir çözüm olarak düşünmüyordum, küçük projeler için muhtemelen çok kötü olmazdı. Esas olarak bu fikrin diğer fikirleri ortaya çıkarmaya yardımcı olacağını umuyordum.
Bunu yapmak için belirli bir neden var mı? Sahte işaretçilerle sorun yaşıyor musunuz, yoksa bir gün bir sorun olabileceğini mi düşünüyorsunuz?
IMHO Uygulamanızı doğru tasarlarsanız ve uygun kalıpları kullanmanız size yardımcı olmazsa sorun olmaz.
patters hakkında bazı bilgiler: İkinci bir fikir için
- 1. C++ bir dizi işaretçi için bellek ayırma
- 2. nesnelerin bir işaretçi dizisi ile bellek ayırma ve yöntem
- 3. python içindeki bir nesneye yapılan tüm referansları bul
- 4. Birden fazla dış git reposunu bir git repo'ya birleştirmek ve hala kökenleri takip edebilmek
- 5. LLDB: Tüm nesneleri bir nesneye bir işaretçi ile gösterme
- 6. Birden Fazla Kritere Göre Bir Diziden Birden Fazla Nesne Çekme
- 7. Düzgün bir kamera nasıl takip edilir?
- 8. angular2: nesne başka bir nesneye nasıl kopyalanır
- 9. Geçici Tanım ve bellek ayırma
- 10. başka bir sınıfta yapılan bir nesne için bir alan
- 11. @RequestBody bir nesneye dönüştürme
- 12. Belirli bir bayt sayısını bellekte ayırma
- 13. İşaretçi için geçici bir işaretçi nasıl yok edilir?
- 14. Belirli bir deyimdeki SQLAlchemy bellek resmi belirtme
- 15. Tek bir satıra birden fazla faktör nasıl transfer edilir?
- 16. rspec'de bir lambdadan sonra birden fazla şey nasıl test edilir?
- 17. Julia bellek ayırma ve kod kapsamı sonuçları nasıl analiz edilir
- 18. Denetleme eğer belirli bir sınıf C++ bir işaretçi işaret
- 19. JSON dosyası nasıl yüklenir ve belirli bir nesneye dönüştürülür?
- 20. Atılan bir nesneye erişilemiyor. Nesne adı: System.Net.Sockets.NetworkStream
- 21. Nasıl özel bir nesneye
- 22. PMD - Bir kural içinde bir kural nasıl devre dışı bırakılır?
- 23. Gerçekte ctor mu arıyor ve vtable'ı bir nesneye bir işaretçi üzerinde mi başlatıyorum? C++
- 24. Başka bir kural kümesinde bir etkinliği kaldırma
- 25. Bir sütunu birden çok satıra ayırma
- 26. TProc'nin dahili (bellek) gösterimi ve referanslar
- 27. Birden fazla jFrames'ten bir değişkene nasıl erişebilirim?
- 28. Diziyi belirli bir öğeye göre ayırma
- 29. Gömülü bir platformda konu sınıfı bellek ayırma tuhaflığı
- 30. Dosyaya Serileştirilecek bir nesne nasıl enjekte edilir?
+1, TInterfacedObject sınıflara (veya ona benzer bir kök sınıf bina) bir refcount inşa etmek için basit bir yol olacağını yönetici sınıfı – mjn