Có một đối tượng của lớp QNetworkReply. Có một khe (trong một số đối tượng khác) được kết nối với tín hiệu () đã hoàn thành của nó. Các tín hiệu là đồng bộ (mặc định). Chỉ có một chủ đề.
Tại một thời điểm nào đó tôi muốn loại bỏ cả hai đối tượng. Không có thêm tín hiệu hoặc bất cứ điều gì từ chúng. Tôi muốn chúng biến mất. Tôi nghĩ, tôi sẽ sử dụng
delete obj1; delete obj2;
Nhưng tôi thực sự có thể? Các thông số kỹ thuật cho ~ QObject nói:
Xóa QObject trong khi các sự kiện đang chờ xử lý đang chờ được phân phối có thể gây ra sự cố.
'Sự kiện đang chờ xử lý' là gì? Điều đó có thể có nghĩa là trong khi tôi đang gọi điện delete
, đã có một số 'sự kiện đang chờ xử lý' được gửi đến và chúng có thể gây ra sự cố và tôi không thể thực sự kiểm tra xem có sự kiện nào không?
Vì vậy, giả sử tôi gọi:
obj1->deleteLater(); obj2->deleteLater();
Để được an toàn.
Nhưng, tôi có thực sự an toàn? Thêm deleteLater
một sự kiện sẽ được xử lý trong vòng lặp chính khi điều khiển đến đó. Có thể có một số sự kiện (tín hiệu) đang chờ xử lý cho obj1
hoặc obj2
đã ở đó, đang chờ xử lý trong vòng lặp chính trước khi deleteLater sẽ được xử lý không? Điều đó sẽ rất đáng tiếc. Tôi không muốn viết mã kiểm tra trạng thái 'phần nào đã bị xóa' và bỏ qua tín hiệu đến trong tất cả các vị trí của tôi.
obj->disconnect(); obj->deleteLater();
là cách phù hợp để đi: