Делать Методы MSXML взять в память владение своими параметрами BSTR?
Например: load
, getElementsByTagName
, или же selectSingleNode
Я спрашиваю это, потому что я видел коды, которые просто вызывают CString
«s AllocSysString()
и передать его в методы MSXML без вызова SysFreeString()
впоследствии.
РЕДАКТИРОВАТЬ:
Быстрое исправление для кодов, которые я видел, используя _bstr_t
: https://stackoverflow.com/a/14471409/109747 (мой пост)
Обратите внимание, что правила о владении не относятся к конкретной библиотеке (при условии разумно написанной библиотеки, которая соблюдает правила!).
Главным образом, они все о здравом смысле.
если ты проходить параметр «по ссылке» на метод:
Здравый смысл: Метод может изменить то, на что указывает ссылка. Поскольку вы не можете заранее знать, произойдет ли это или нет, вы не можете контролировать время жизни значения, отправленного методу, поэтому вы должны отказаться от права собственности на метод. Если метод должен заменить значение, на которое указывает ссылка, то оно должно быть тем, которое его высвобождает.
Кроме того, если метод делает контрольную точку на чем-то другом или оставляет исходное значение нетронутым, метод не может контролировать, что вы будете делать с этим значением (см. 1), поэтому он должен отказаться от владения в конце разговора.
Если метод не изменяет то, на что указывает ссылка, тогда он в основном приобретает право собственности на значение параметра и при возврате уступает это же владение тому же значению.
Я знаю; все это может пахнуть грязью … ты знать что вы обычно не владеете базовым объектом, возвращаемым методом. Например, может быть семантически понятно, что объект, который вы получаете от данного метода, является тем же самым объектом, возвращенным идентичным вызовом того же самого метода (например, некоторые ->GetCurrentSession()
метод), так как вы могли бы быть его владельцем? Но я не говорил, что вы владеете объектом — я сказал, что вы владеете значением параметра, и значение параметра в таком случае является указателем интерфейса COM. В этом случае право собственности означает, что вы должны позвонить ->Release()
когда закончите, это не повлияет на другие указатели интерфейса на тот же базовый объект.
Обновлено, чтобы добавить информацию:
Вещи могут запутаться для определенных типов, но вам просто нужно очистить слои, чтобы знать, что делать:
BSTR
параметр «по значению», а BSTR*
«по ссылке». VariantClear(...)
,@afriza: код, который вы упоминаете, пропускает эти строки.
Других решений пока нет …