işaretçi üyesi atamak UsesTheCallable
yapıcısına m_callable
üyesini argümanın adresine atayın; bu, yapıcının tne ucunda kapsam dışı kalmalı ve böylece UsesTheCallable::call()
numaralı telefonu aradığımda, artık mevcut olmayan bir nesne üzerinde çalışıyorum.Geçiş çağrılabilir nesne, aşağıdaki Biz esas yapan bir taşeron gelen kodu almış
yüzden bu ana yöntemle denedim:
int main(int, char**)
{
UsesTheCallable<Callable>* u = NULL;
{
Callable c;
u = new UsesTheCallable<Callable>(c);
}
u->call();
delete u;
return 0;
}
Ben Callable
nesne ben UsesTheCallable::call()
aramadan önce kapsam dışına gider emin olun, bu yüzden bellek işlevini çağırarak olması gerektiğini ı don Aslında bu noktada var. Ancak kod çalışıyor ve Valgrind, Callable
sınıfına bazı üye verileri eklese ve operator()
işlevinin bu üye verilerinde hareket etmesini sağlasa bile bellek hataları bildirmiyor.
Bu kodun tanımlanmamış bir davranış olduğunu düzelttim mi? Callable
'un üye verilerine sahip olup olmadığına (ör. Özel bir int
değişken veya bir şey) bağlı olarak bu kodun "tanımlı" kısmında bir fark var mı?
Sadece bir şey "çalışıyor", gördüğünüz davranış tanımsız olduğu anlamına gelmez. Şimdi "çalışabilir" ve bazı rastgele alakasız kodlar ekliyor ve çalışmayı durduruyor. – iheanyi
@iheanyi: OP, bunu biliyor gibi görünüyor ya da kodun UB'ye sahip olup olmadığını sormuyorlardı. –
@iheanyi Bunun farkındayım. Sadece alt yüklenicimize ne yaptıklarını bilmediklerini söyleyen _sure_ undefined yapmak istedim – villapx