Используя обоих экстенсивно, я думаю, что Wedge был на деньгах в замечании "TFS, включает отслеживание ошибок, отслеживание объекта работы и другие функции вне управления исходным кодом".
Однако я могу честно сказать, что SVN и TFS кажутся довольно равными в отношении масштабируемости, и если что-нибудь управление исходным кодом SVN имеет преимущество на TFS из-за его свойственной простоты.
, Если Вы хотите объект работы и отслеживание ошибок вместе с Вашим управлением исходным кодом тогда Вы или идете для TFS или Вы идете с SVN и некоторым другим, возможно свободным, инструменты, такие как Bugzilla. В то время как TFS действительно интегрирует и управление исходным кодом и объект работы, отслеживающий вместе, я честно думаю, что MS должен был отдать его даром как извинение за злоупотребление такого количества разработчиков с VSS за эти годы.
Утечка, потому что get_Bar ()
и get_Baf ()
не знают, что вы используете CComBSTR.
Когда вы берете адрес CComBSTR, то, что вы фактически передаете базовому объекту, является указателем на член BSTR CComBSTR.
Разрыв последовательности :
CComBSTR str;
Это инициализирует внутренний BSTR равным NULL.
pFoo->get_Bar(&str);
get_Bar ()
видит BSTR * и заполняет его фактическими данными. Примерно так:
HRESULT get_Bar(BSTR* arg) { *arg = SysAllocString(L"My String"); }
Теперь внутренний BSTR str
является настоящим BSTR. Когда CComBSTR выходит за пределы области видимости, он удаляет член str
.
Теперь, если вы вызовете get_Baf ()
на & str, проблема в том, что CComBSTR не знает, что вы меняя строку.
Вероятно, вы читали об этом на этой странице Microsoft:
http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx
Проблемы с утечкой памяти
Передача адреса инициализированного CComBSTR в функцию в качестве параметра [out] вызывает утечку памяти.
Объект CComBSTR распределяет память внутри. Видно, есть случаи, когда он его не выпускает.