Ответ на вопрос: Да, вы должны использовать CoTaskMemFree для освобождения памяти, выделенной с помощью CoTaskMemAlloc.
Другие ответы хорошо объясняют, почему CoTaskMemAlloc и CoTaskMemFree необходимы для памяти, передаваемой между COM-серверами и COM-клиентами, но они напрямую не ответили на ваш вопрос.
Ваш учитель был прав: вы должны всегда использовать соответствующую функцию освобождения для любого ресурса. Если вы используете новый, используйте delete. Если вы используете malloc, используйте бесплатный.Если вы используете CreateFile, используйте CloseHandle. И т. Д.
Еще лучше, на C++, используйте объекты RAII, которые выделяют ресурс в конструкторе и освобождают ресурс в деструкторе, а затем используют эти обертки RAII вместо голой функции. Это упрощает и очищает код, который не течет, даже если вы получаете что-то вроде исключения.
Стандартная библиотека шаблонов предоставляет контейнеры, которые реализуют RAII, поэтому вы должны научиться использовать std :: vector или std :: string, а не выделять голой памяти и пытаться управлять ею самостоятельно. Существуют также интеллектуальные указатели, такие как std :: shared_ptr и std :: unique_ptr, которые можно использовать для обеспечения правильного выбора разговора в нужное время.
ATL предоставляет некоторые классы, такие как ATL :: CComPtr, которые являются объектами-оболочками, которые обрабатывают подсчет ссылок на COM-объекты для вас. Они не являются надежными для правильной работы и, по сути, имеют еще несколько исправлений, чем большинство современных классов STL, поэтому внимательно прочитайте документацию. При правильном использовании относительно легко убедиться, что вызовы AddRef и Release все совпадают.
Связанные чтения: [Распределение и освобождение памяти через границы модулей] (http://blogs.msdn.com/b/oldnewthing/archive/2006/09/15/755966.aspx). – GSerg