Методы MSXML занимают в памяти свои параметры BSTR?

Делать Методы MSXML взять в память владение своими параметрами BSTR?

Например: load, getElementsByTagName, или же selectSingleNode

Я спрашиваю это, потому что я видел коды, которые просто вызывают CString«s AllocSysString() и передать его в методы MSXML без вызова SysFreeString() впоследствии.

РЕДАКТИРОВАТЬ:
Быстрое исправление для кодов, которые я видел, используя _bstr_t: https://stackoverflow.com/a/14471409/109747 (мой пост)

1

Решение

Обратите внимание, что правила о владении не относятся к конкретной библиотеке (при условии разумно написанной библиотеки, которая соблюдает правила!).

Главным образом, они все о здравом смысле.

  1. если ты Получать параметр метода, теперь вы его владелец.
    Здравый смыслОбъект, чей метод передал значение обратно, не может знать, как будет использоваться значение параметра и когда оно больше не понадобится. У него нет выбора, кроме как отказаться от владения, и вы новый владелец.
  2. если ты проходить параметр «по значению» для метода, вы все еще являетесь владельцем.
    Здравый смысл: Метод не знает, откуда появился параметр. У него нет возможности узнать, нужно ли вам это по-прежнему. Следовательно, он не может быть владельцем. Вы.
  3. если ты проходить параметр «по ссылке» на метод:

    • Вы все еще являетесь владельцем ссылки (см. 2).
    • Вы отказываетесь от владения ценностью, которую вы передали.
    • Вы приобретаете право собственности на стоимость, которую вы получаете обратно.

    Здравый смысл: Метод может изменить то, на что указывает ссылка. Поскольку вы не можете заранее знать, произойдет ли это или нет, вы не можете контролировать время жизни значения, отправленного методу, поэтому вы должны отказаться от права собственности на метод. Если метод должен заменить значение, на которое указывает ссылка, то оно должно быть тем, которое его высвобождает.
    Кроме того, если метод делает контрольную точку на чем-то другом или оставляет исходное значение нетронутым, метод не может контролировать, что вы будете делать с этим значением (см. 1), поэтому он должен отказаться от владения в конце разговора.
    Если метод не изменяет то, на что указывает ссылка, тогда он в основном приобретает право собственности на значение параметра и при возврате уступает это же владение тому же значению.

Я знаю; все это может пахнуть грязью … ты знать что вы обычно не владеете базовым объектом, возвращаемым методом. Например, может быть семантически понятно, что объект, который вы получаете от данного метода, является тем же самым объектом, возвращенным идентичным вызовом того же самого метода (например, некоторые ->GetCurrentSession() метод), так как вы могли бы быть его владельцем? Но я не говорил, что вы владеете объектом — я сказал, что вы владеете значением параметра, и значение параметра в таком случае является указателем интерфейса COM. В этом случае право собственности означает, что вы должны позвонить ->Release() когда закончите, это не повлияет на другие указатели интерфейса на тот же базовый объект.

Обновлено, чтобы добавить информацию:
Вещи могут запутаться для определенных типов, но вам просто нужно очистить слои, чтобы знать, что делать:

  • BSTR — это указатели на память. Да, вы передаете память по ссылке, но в COM вы управляете указателями, а не основной памятью; поэтому обсуждение «по значению» / «по ссылке» относится к самому BSTR (указателю). Это BSTR параметр «по значению», а BSTR* «по ссылке».
  • ВАРИАНТЫ иногда содержат значения, иногда ссылки. Но опять же, в COM вы не управляете базовыми значениями напрямую; вы управляете ВАРИАНТАМИ. «По значению» применяется к VARIANT, и любая базовая ссылка обрабатывается, когда владелец VARIANT вызывает VariantClear(...),

@afriza: код, который вы упоминаете, пропускает эти строки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]