Если вы решили создать свою структуру данных и вернуть указатель (ваш второй способ, там), вызывающий должен знать, КАК вы выделили для этого место ... вы использовали malloc(), или GlobalAlloc() или какой-либо другой механизм? ... и затем используйте соответствующий метод, чтобы избавиться от вещи. Это достаточная причина для того, чтобы клиент выделил пространство и передал указатель, на мой взгляд.
Тем не менее, я бы никого не убивал, если бы использовал какой-либо метод, если бы они позаботились о том, чтобы правильно освободить память.
Это одна из причин, по которой COM-объекты полезны: клиенту не нужно знать, как был создан объект, он просто должен вызвать Release(), когда это будет сделано.