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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Andrey
Сообщения: 5
Зарегистрирован: 27 апр 2004, 08:36

Если не трудно помогите разобраться.

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

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

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

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

О причине я догадываюсь, но можно ли от этого избавиться незнаю.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

У программы-сервера своя куча, у клиента - другая. Ты пытаешься освободить память в чужой куче.
Память в COM надо выделять в помошью интерфейса IMalloc. RTFM CoGetMalloc().
2B OR NOT(2B) = FF
Andrey
Сообщения: 5
Зарегистрирован: 27 апр 2004, 08:36

Но тем не менее в релизе проблемы не вылазят, и утечек памяти не видно. К тому же требуется вызов конструктора класса после выделения памяти. Я конечно понимаю, что проблему можно решить и по другому, что уже сделано, но интерес остался
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

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

В Release - варианте проект не работает, а делает вид что работает. Надо переписать.
2B OR NOT(2B) = FF
Ответить