Здравствуйте, algol, Вы писали:
A>Здравствуйте, j s p, Вы писали: JSP>>Нашел в рабочем проэкте A>Тут не смеяться, тут плакать надо, причем над каждой строчкой.
А можете пожалуйста прокомментировать над чем именно плакать?
Я заметил лишь:
— глупое использование флага = true/false
— не надо было заморачиваться с удалением вручную созданных объектов...
достаточно было воспользоваться умным указателем.
— Не совсем корректно продуманно... он бы уже либо кодами возврата пользовался,
либо уже исключениями...
Здравствуйте, sjukov, Вы писали:
S>Что еще упустил?
Видимо крайне оригинальный способ добычи интерфеса IBindStatusCallback
из класса-враппера DownloadStatusCallback: DownloadStatusCallback* statusCallbackPtr= new DownloadStatusCallback;
statusCallbackPtr->QueryInterface(IID_IUnknown, (void**)&pUnk);
pUnk->QueryInterface(IID_IBindStatusCallback, (void**)&statusCallbackPtr);
Конечно, я не эксперт COM-программинга, возможно это в порядке вещей.
Правда, скорее всего случится меморилик, но судя по всему 9/2/2004 эту проблему пофиксили,
вероятно внедрением какого-то эвристического алгоритма подсчета ссылок в метод
~DownloadStatusCallback(). . Вобщем, деструктор в студию!
А так, есдинственная трабла, если вызов
Здравствуйте, gerrCrazzy, Вы писали:
C>Здравствуйте, sjukov, Вы писали:
S>>Что еще упустил?
C>Видимо крайне оригинальный способ добычи интерфеса IBindStatusCallback C>из класса-враппера DownloadStatusCallback: C> C>DownloadStatusCallback* statusCallbackPtr= new DownloadStatusCallback; C>statusCallbackPtr->QueryInterface(IID_IUnknown, (void**)&pUnk); C>pUnk->QueryInterface(IID_IBindStatusCallback, (void**)&statusCallbackPtr); C>C>Конечно, я не эксперт COM-программинга, возможно это в порядке вещей. C>Правда, скорее всего случится меморилик, но судя по всему 9/2/2004 эту проблему пофиксили, C>вероятно внедрением какого-то эвристического алгоритма подсчета ссылок в метод C>~DownloadStatusCallback(). . Вобщем, деструктор в студию!
Способ супер-оригинальный учитывая, что DownloadStatusCallback наследник IBindStatusCallback.
Ликов никаких не будет так как в конце есть явный вызов оператора delete.
Ну а деструктор — он пустой.
Здравствуйте, WoldemaR, Вы писали:
WR>Здравствуйте, j s p, Вы писали:
WR>А можно мне позанудствовать? Спасибо.
WR>Разве Release() не вызывает delete this; ?
Здравствуйте, sjukov, Вы писали:
S>А можете пожалуйста прокомментировать над чем именно плакать?
Ладно, поехали.
Судя по определению, это функция потока. Не самая лучшая идея определять ее как static в CMainDlg. В качестве параметра ей передается указатель на ProgressDlg (вероятно это все на MFC). Т.е. можно предположить, что ProgressDlg создан в другом потоке. Передавать указатели на оконные классы в другой поток нельзя, можно передавать только HWND.
Дальше идут просто зверские манипуляции вокруг DownloadStatusCallback. Раз уж этот класс так тесно завязан на ProgressDlg, логично было бы реализовать IBindStatusCallback в самом ProgressDlg. В любом случае DownloadStatusCallback наследован от IBindStatusCallback и вместо этих шаманских плясок можно было воспользоваться cast-ом. Когда делается QueryInterface, то нужно было указывать IBindStatusCallback*, а не сохранять его обратно в DownloadStatusCallback. Сам класс можно было бы создать на стеке и не заморачиваться с его удалением в catch.
Дальше мы имеет два catch на свои же генерируемые exceptions. Никаких других исключений тут быть не может. Всю обработку исключений можно было бы сразу запихнуть в if. За MessageBox-ы с нулевым HWND нужно просто сразу убивать.
Свои 5 копеек — если даже такой простой кусок кода
вызывает споры по поводу его поведения и безопасного удаления
всех выделенных ресурсов, то что же в остальной программе?
Здравствуйте, anidal, Вы писали:
A>Свои 5 копеек — если даже такой простой кусок кода A>вызывает споры по поводу его поведения и безопасного удаления A>всех выделенных ресурсов, то что же в остальной программе?
Да нет тут никакой проблемы. Товарищ *индус* просто забыл, что создает DownloadStatusCallback не через COM, а просто как экземпляр класса. Все эти Release() тут нафиг не нужны, нам по барабану, что будет в счетчике ссылок при удалении объекта. Кстати, это еще вопрос, что содержится в реализации AddRef/Release этого класса и подсчитываются ли ссылки реально.
А насчет остальной программы — если она написана в таком же стиле, то это просто хорошо упитанный пушной зверек.
Ведете себя как студенты.
Неужели не понятно, что нельзя ругать чужой код, если не знаешь как и в каких условиях это писалось. А мы поехали: "можно предоложить, что то, можно предположить, что се...".
Возможно человек ни разу в жизни не писал Си.. возможно, ему надо было за 10 минут исправить баг в чужой программе, да мало ли чего еще бывает в жизни.. может это не программист писал, а талантливый дворник, который один остался в развалившейся конторе. Его уважать надо, а не издеваться над ним.
В общем, ИМХО, надо быть мудрее.
Удачи.
Здравствуйте, sjukov, Вы писали:
S>Здравствуйте, algol, Вы писали:
A>>Здравствуйте, j s p, Вы писали: JSP>>>Нашел в рабочем проэкте A>>Тут не смеяться, тут плакать надо, причем над каждой строчкой.
S>А можете пожалуйста прокомментировать над чем именно плакать? S>Я заметил лишь: S>- глупое использование флага = true/false S>- не надо было заморачиваться с удалением вручную созданных объектов... S>достаточно было воспользоваться умным указателем. S>- Не совсем корректно продуманно... он бы уже либо кодами возврата пользовался, S> либо уже исключениями...