Как правильно выделить память ?
От: Аноним  
Дата: 09.12.05 10:58
Оценка:
Привет.

Есть такая проблемка.

Есть библиотека написанная на managed C++. В ней есть метод:


GetInfo (
....
[Out] String** ppresult)
{
...
*ppresult = ExecuteAndReadCommandOutput(Command);
...
}


ExecuteAndReadCommandOutput читает, кое-что из базы в возращает это в виде String *


Друга библиотека, вызывает через У 1-й этот метод. и записывает результат в bstr_t

_bstr_t str_res;

.get_adapter()->GetInfo(...
&(str_res.GetBSTR()));

после того, как вызывается декструторв для _bstr_t происходит попытка освободить память занятую по строку с помощью SysFreeString — вызов котого наламывается (invalid pointer use) Т.к. память была выделана иначе, нежели SysAllocString

Вопрос: как правильно ее выделить в 1-й библиотеке или осовободить в 2-й?

Спасибо!
Re: Как правильно выделить память ?
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 09.12.05 11:47
Оценка:
Здравствуйте, Аноним, Вы писали:


А не проще завести переменную типа String *, считать в нее, а потом освободить (возможно, через специальную функцию первой ДЛЛ)?

ЗЫ. Ни с managedC++, ни с _bstr_t не работал,и специфики их работы не знаю. Советую просто по опыту обычного С++.
Re[2]: Как правильно выделить память ?
От: Аноним  
Дата: 09.12.05 12:01
Оценка:
Здравствуйте, BitField, Вы писали:

BF>Здравствуйте, Аноним, Вы писали:



BF>А не проще завести переменную типа String *, считать в нее, а потом освободить (возможно, через специальную функцию первой ДЛЛ)?


BF>ЗЫ. Ни с managedC++, ни с _bstr_t не работал,и специфики их работы не знаю. Советую просто по опыту обычного С++.



Спасибо за совет . Но хотелось бы все таки узнать как правильно выделить память. Чтоб потом SysStringFree ее смог корректно осободить. Я тоже мало работал с managed C++. В обысном C++ можно воспользоватся

_bstr_t bstrWrapper;
BSTR bstr = SysAllocString(OLESTR("some string"));
bstrWrapper.Attach(bstr);

тут bstrWrapper нормально разрушится и все будет хорошо

а вот если выделить память так:

_bstr_t bstrWrapper;
BSTR bstr = L"some string";
bstrWrapper.Attach(bstr);

то получится такая-же ситиация (bad pointer use). Что неудивительно.
Re: Как правильно выделить память ?
От: Аноним  
Дата: 09.12.05 12:17
Оценка:
Здравствуйте, Аноним, Вы писали:

Там где метод GetInfo реализуется, надо использовать SysAllocString (или варианты типа SysAllocStringLen).
В клиенте, если используешь _bstr_t, то достаточно будет

get_adapter()->GetInfo(&str_res);

Правильно выделенная на стороне сервера строка будет в итоге удалена деструктором str_res.


Ну а про сам SysAllocString/SysAllocStringLen читай в MSDN.
Там все просто до безобразия.
Re[2]: Как правильно выделить память ?
От: Аноним  
Дата: 09.12.05 13:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>Там где метод GetInfo реализуется, надо использовать SysAllocString (или варианты типа SysAllocStringLen).

А>В клиенте, если используешь _bstr_t, то достаточно будет

А>get_adapter()->GetInfo(&str_res);


А>Правильно выделенная на стороне сервера строка будет в итоге удалена деструктором str_res.



А>Ну а про сам SysAllocString/SysAllocStringLen читай в MSDN.

А>Там все просто до безобразия.

Пробоовал. Но не получается преобразовать String * str в OLECHAR*,
SysAllocString((OLECHAR*)&str) — такой вариант не канает. Может есть какой-то более правильной спосом преобразования?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.