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> headki 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ı nodebunu yaparsam beri takip (çok zor aldığı halde, s' kuyruk Özyinelemeyi kullanın) datayı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 -O3bir kuyruk özyinelemesini optimize edemedi (karmaşık bir örnekte).