Wpis z mikrobloga

#cpp #cpp14 czy jeżeli mam listę wskaźników QList list i zrobię coś takiego:

for (void * ptr : list) {
delete ptr;
ptr = 0;
}
row.removeAll(0);

to DLACZEGO to zadziała? Tzn. bo działa ale wg mnie powinienem podać w pętli for referencję do wskaźnika, a tak to wskaźnik ptr jest kopią tego z listy więc przypisanie mu wartości 0 nie powinno działać. Ew. jak zrobić tak by nie działało? Tzn. wiem, że delete bez przypisania to trochę bez sensu ale teoretycznie taka możliwość powinna istnieć, nie? #programowanie
  • 26
@michak: przypisuję 0 żeby później wywalić z listy. Nie wolno wywalać w trakcie bo się #!$%@?. Zresztą, to tylko przykład - mógłbym przypisywać co innego... chodzi mi o to czy powinienem mieć *& czy *.
@michak: a jak zadziała auto skoro np. mam listę QList to "for (const QString& ref : list)" i "for (const QString str : list)" to zupełnie inne polecenia, robią co innego i nie jest tak, że jedne jest gorsze od drugiego... służą do czego innego więc jak by się tam auto zachowało?
@Djuna: @michak: ale tu ekspertów xd
rzeczywiście, ptr jest w tym przypadku kopią wskaźnika. Natomiast działa to w połowie tak jak chcesz - tworzona jest kopia wskaźnika ptr, zwalniana jest pamięc pod tą kopią (równocześnie pod oryginałem - przecież wskazują na ten sam obszar pamięci. Poźniej przypisujesz NULLa do kopii, nie do oryginału. Jeśli chcesz również przypisać NULLa do oryginału, to musisz zrobić tak jak napisałeś - referencje to wskaźnika.
@pingwindyktator: możliwe, że ratował mnie interpretator kodu który już kiedyś mi się nie wywalał gdzie powinien... odwoływałem się do funkcji usuniętego obiektu i działało długi czas, póki nie weszła nowa wersja qmake.
@Djuna: "odwoływałem się do funkcji usuniętego obiektu"
takie zachowanie generuje UB - undefinied behaviour. Może stać się cokolwiek. Może zadziałać dobrze, może wywalić się w tym miejscu a może działać jeszcze rok i wywalić się zupełnie gdzie indziej
@pingwindyktator: tak, teraz już to akurat wiem od jakiegoś czasu. :) Dzielę się wrażeniami bo myślę, że taki właśnie mniej-więcej UB może być w funkcji QList::removeAll z Qt. Albo coś...
@Djuna

for (void * ptr : list) {
delete ptr;

O.o co ja #!$%@? patrze.... ten wykop to faktycznie ma specjalistów.


Po za tym lista ma po prostu clear. A jak chcesz usunąć tylko kilka to korzystasz z remove_if tak jak @pingwindykator powiedział.