Aşağıdaki tek bağlantılı liste uygulamasını düşünün:
struct node {
std::unique_ptr<node> next;
ComplicatedDestructorClass data;
}
Şimdi diyelim std::unique_ptr<node> head
ki daha sonra kapsam dışı olan ve yıkıcısının çağrılmasına neden olan bir örneği kullanmayı bırakıyorum.
Bu, yığınımı yeterince büyük listeler için patlatacak mı? Adil derleyici (inline oldukça karmaşık optimizasyon yapacak varsaymak mı unique_ptr
'içine s yıkıcı node
bunu yaparsam beri takip (çok zor aldığı halde, s' kuyruk Özyinelemeyi kullanın) data
yıkıcı obfuscate ediyorum next
, 'ın zor hale getirmekte derleyicinin olası yeniden sıralama ve kuyruk arama fırsatını fark etmesi için):
struct node {
std::shared_ptr<node> next;
ComplicatedDestructorClass data;
}
Bir data
şekilde bir işaretçisi varsa node
, kuyruk özyineleme için bile imkansız olabilir (tabii ki bu tür kapsülleme ihlallerinden kaçınmaya çalışmalıyız).
Genel olarak, başka türlü bu listeyi nasıl yok edecek? Listede dolaşamayız ve "geçerli" düğümü silemeyiz, çünkü paylaşılan işaretçide bir release
! Tek yol, benim için gerçekten kötü kokulu özel bir silme ile.
gcc -O3
bir kuyruk özyinelemesini optimize edemedi (karmaşık bir örnekte).