Требуется ли перераспределение BSTR, переданного по ссылке, в вызывающей функции?

#winapi #com #ole #bstr

#winapi #com #ole #bstr

Вопрос:

 BSTR newID_x = SysAllocString(L"newID");
BSTR newX_x = SysAllocString(L"newX");

functionA(amp;newID_x);

//Func A does some operation on newID_x, we have that value in newID_x now

functionA(amp;newX_x);
//After Func A is called for the second time, both newID_x and newX_x become the same
//i.e, both are pointing to same locations and hence values too
  

Мой вопрос в том, является ли это правильным поведением для BSTR s, нужно ли нам сохранять newX_x в каком-то новом BSTR после вызова functionA в первый раз?

Или это неправильно со стороны functionA того, что это может быть неправильное выделение / отмену выделения переданных BSTR файлов.

Комментарии:

1. Можете ли вы показать нам определение functionA ?

2. Для BSTRs нет подсчета ссылок. Следовательно, функция должна освободить переданный BSTR и выделить новый.

Ответ №1:

То, что вы описываете, является семантикой параметра «in-out» — параметр инициализируется перед вызовом, затем во время вызова он изменяется, и изменение видно вызывающей стороне. Это приемлемо, но иметь такой интерфейс не очень удобно. В этом случае вызываемому абоненту придется перераспределить BSTR , а затем передать право собственности вызывающему абоненту.

Комментарии:

1. Можете ли вы предложить альтернативный способ сделать это? В моем случае, если я не инициализирую newX_x или newID_x с помощью SysAllocString и просто передам его функции A, будет ли это лучшим подходом? Приведет ли это к другому поведению после возврата вызова функции?

2. @ammar: Это зависит от того, какую семантику вы хотите. Вы могли бы, например, иметь один параметр «in» и один параметр «out» вместо этого. Это действительно зависит от того, как вы хотите использовать эту функцию.