Ak vracias vo funkcii objekt ktory ma netrivialny konstruktor/destructor(pripadne sa prekladac rozhodne ze je objekt moc velky) tak sa vo funkcii vytvori skryty parameter ktory ma typ ako pointer na navratovy typ. Ked zavolas tuto funkciu, tak funkcia z ktorej volas alokuje premennu na svojej casti stacku a tuto neinicialiovanu premennu preda funkcii v skrytom parametre. Funkcia ktora vracia tento objekt v skutocnosti nic nealokuje, len vola konstruktor(vecsnou kopirovaci, v pripade urcitych optimalizacii len obycajny) pre objekt ktory jej bol predany v skrytom parametre. Funkcia ktora alokovala objekt bere navratovu hodnotu ako rvalue, takze po skonceni vyhodnocovania vyrazu sa zavola destructor pre danu "vratenu" premennu bez ohladu na to ci ju pouzies alebo nie.
Dalsia monost je ze vracany typ ma trivialny konstruktor/destructor(a objekt je maly). Vtedy sa vracia cez registre a nevznika na stacku ziadna premenna, take netreba nic mazat.
Premenne na stacku nemusis rucne "mazat".V tvojom pripade zrejme program pada z ineho dovodu.