Страница 1 из 1

Проблема с выделением памяти в куче

Добавлено: 29 апр 2004, 08:38
Andrey
Если не трудно помогите разобраться.

Происходит следующее. Если в СОМ объекте выделить память а в клиенте ее освобождать, то отладчик вываливается при проверке кучи в момент освобождения памяти.
аналог кода такой:

в СОМ:
fn([out, retval] long *pVal)
{
*pVal=(long) new BYTE[100]
return OK;
}

В клиенте:
BYTE *pData=fn();
delete []pData;

на синтаксис внимание не обращайте, используюся wrapped классы для позднего связывания.
сервер подключается как LOCAL_SERVER

О причине я догадываюсь, но можно ли от этого избавиться незнаю.

Добавлено: 29 апр 2004, 10:17
Absurd
У программы-сервера своя куча, у клиента - другая. Ты пытаешься освободить память в чужой куче.
Память в COM надо выделять в помошью интерфейса IMalloc. RTFM CoGetMalloc().

Интересно

Добавлено: 30 апр 2004, 08:57
Andrey
Но тем не менее в релизе проблемы не вылазят, и утечек памяти не видно. К тому же требуется вызов конструктора класса после выделения памяти. Я конечно понимаю, что проблему можно решить и по другому, что уже сделано, но интерес остался

Re: Интересно

Добавлено: 30 апр 2004, 10:27
Absurd
Andrey писал(а):Но тем не менее в релизе проблемы не вылазят, и утечек памяти не видно. К тому же требуется вызов конструктора класса после выделения памяти. Я конечно понимаю, что проблему можно решить и по другому, что уже сделано, но интерес остался
Объект в уже готовом буфере можно создать с помощью placement new.
Делается это так :
new(адрес_объекта)тип_объекта(параметры конструктора);
Для разрушения объекта тогда надо явно вызывать деструктор
адрес_объекта->~тип_объекта();
И освобождать память явно (в данном случае через IMalloc).

В Release - варианте проект не работает, а делает вид что работает. Надо переписать.