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
  • Odpowiedz
@lionbest:

Nie, nie powinieneś nigdy tego robić, a co jeżeli tam masz wskaźnik np na coś co przechowuje vector, listę albo string?

Ale nie mam. To mój program i wiem gdzie na jakich danych operuje, nie? Zresztą, wstawiłem tam "void" tylko ot, tak sobie żeby nie zapoznawać was z moimi klasami i nie powodować zamieszania z klasami/makrami Qt. U mnie to wygląda tak:

void DatabaseManager::remove_row(QList &row) {
for (Field *& field
  • Odpowiedz
@Djuna: Uf... to dobrze bo już mi ciarki po plecach przeszły że takie rzeczy na wykopie widzę.

Co do twojego kodu to też jest do niczego. Emitujesz sygnał i usuwasz obiekt, a co jak connection będzie z innego wątku albo jako Qt::QueuedConnection? Do tego służy deleteLater. Czyli:

void DatabaseManager::remove_row(QList &row) {
for (Field * field : row) {
field->deleteLater();
}
row.clear();
}
  • Odpowiedz
a co jak connection będzie z innego wątku albo jako Qt::QueuedConnection?


@lionbest: no ale nie będzie. xD

Do tego służy deleteLater


Wygooglane. Masz rację. Wymyślałem koło na nowo bo nie znałem tej funkcji. :) Chyba czas przeczytać tę nieszczęsną dokumentację od deski do deski, a nie tylko co ciekawsze fragmenty. :P
  • Odpowiedz