Здравствуйте, Bell, Вы писали:
B>Здравствуйте, maxidroms, Вы писали:
B>Если для выделения используешь new[], то освобождай с помощью delete []. Иначе — неопределенное поведение.
Здравствуйте, maxidroms, Вы писали:
M>Здравствуйте, korzhik, Вы писали:
K>>Здравствуйте, maxidroms, Вы писали:
M>>>Вот представлен следущий код:
K>>
K>> delete [] status;
K>>
M>delete [] status;
M>та же ошибка!
M>пишет как и раньше M>File dbgheap.c M>line 1132
M>expression _CrtIsValidHeapPointer(pUserData)
M>Вылетает на ASSERT в этом файле.
Здравствуйте, Bell, Вы писали:
B>Если для выделения используешь new[], то освобождай с помощью delete []. Иначе — неопределенное поведение.
Не совсем так. new[] выделяет массив, а delete [] вызывает для каждого из удаляемых объектов деструктор.
cout << "Shuting down COM" << endl;
CoUninitialize();
Простите если это сокращение уменьшило объективность.
Я считал это не важной деталью.(Знать где упасть можно было бы сена подстелить)
Так это что то меняет? Можете что то посоветовать чтобы освобождать память без ошибок?
Здравствуйте, maxidroms, Вы писали:
M>Здравствуйте, SergeyL, Вы писали:
M>на самом деле все выглядит так:
M> cout << "Starting service " << "messenger" << endl; M> ENUM_SERVICE_STATUS *status; M> DWORD szReturned; M> pManageService->IWantEnumService("maxidrom",status,szReturned); M> for (int i=0;i<(int)szReturned;i++) M> { M> cout << status[i].lpDisplayName << endl; M> } M> delete [] status; M> cout << "Releasing instance" << endl; M> pManageService->Release();
M> cout << "Shuting down COM" << endl; M> CoUninitialize();
M>Простите если это сокращение уменьшило объективность. M>Я считал это не важной деталью.(Знать где упасть можно было бы сена подстелить) M>Так это что то меняет? Можете что то посоветовать чтобы освобождать память без ошибок?
Возможно, клиентский код не может корректно удалить Ваш массив, потому что не знает его размера?
Попробуйте выделить память в клиенте, а не в сервере.
Здравствуйте, maxidroms, Вы писали:
M>Здравствуйте, korzhik, Вы писали:
K>>у тебя одна программа или используешь dll?
M>Использую COM. M>Память выделяется в COM — объекте.
скорей всего проблема в том что вы используете статическую линковку с CRT. в итоге у вас получается две кучи. В одной куче вы выделяете память, а вдругой освобождаете, поэтому и происходит ошибка. Используйте динамическую линковку с CRT (/MDd, /MD) или используйте к примеру CoTaskMemAlloc,CoTaskMemFree
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, maxidroms, Вы писали:
M>>Здравствуйте, korzhik, Вы писали:
K>>>у тебя одна программа или используешь dll?
M>>Использую COM. M>>Память выделяется в COM — объекте.
K>скорей всего проблема в том что вы используете статическую линковку с CRT. в итоге у вас получается две кучи. В одной куче вы выделяете память, а вдругой освобождаете, поэтому и происходит ошибка. Используйте динамическую линковку с CRT (/MDd, /MD) или используйте к примеру CoTaskMemAlloc,CoTaskMemFree
Чтож...отчасти вы правы оказались.
Действительно в свойствах проекта надо поставить /MD в любом случае.
При этом если запускать программу как CTRL-F5 она уже не вылетает при delete. Но если запустить как F5 то она вылетает в дебаг.
однако если чтроку delete status; перенести после COMObject->Release() или после CoUninitialize() то и вылетать перестает совсем.
Здравствуйте, maxidroms, Вы писали:
M>При этом если запускать программу как CTRL-F5 она уже не вылетает при delete. Но если запустить как F5 то она вылетает в дебаг.
Значит не всё ещё в порядке, хорошы бы конечно разобраться в чём дело. Сделать пошаговую отладку до места где вылетает.
M>однако если чтроку delete status; перенести после COMObject->Release() или после CoUninitialize() то и вылетать перестает совсем.
M>>При этом если запускать программу как CTRL-F5 она уже не вылетает при delete. Но если запустить как F5 то она вылетает в дебаг. K>Значит не всё ещё в порядке, хорошы бы конечно разобраться в чём дело. Сделать пошаговую отладку до места где вылетает.
Пошаговая отладка идет до делете. Дальше вылет в файл osfinfo,c строка 477 в функцию
void __cdecl _unlock_fhandle (
int fh
)
{
LeaveCriticalSection( &(_pioinfo(fh)->lock) );
}
M>>однако если чтроку delete status; перенести после COMObject->Release() или после CoUninitialize() то и вылетать перестает совсем.
K>а CoTaskMemAlloc,CoTaskMemFree пробовали?
Вроде пробовал. Я так понимаю надо было заменить
status=new ENUM_SERVICE_STATUS[100];
на
status=(ENUM_SERVICE_STATUS*)CoTaskMemAlloc(sizeof(ENUM_SERVICE_STATUS)*100);
так?
Если да то он на этой строчке отваливается. Не может так выделить
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, maxidroms, Вы писали:
M>>При этом если запускать программу как CTRL-F5 она уже не вылетает при delete. Но если запустить как F5 то она вылетает в дебаг. K>Значит не всё ещё в порядке, хорошы бы конечно разобраться в чём дело. Сделать пошаговую отладку до места где вылетает.
M>>однако если чтроку delete status; перенести после COMObject->Release() или после CoUninitialize() то и вылетать перестает совсем.
K>а CoTaskMemAlloc,CoTaskMemFree пробовали?
Слушайте а вы вообще работаете или в инете сидите? У нас почти как переписка по чату!
Мало людей кто так оперативно отвечает и так занят этой проблемой. Как будто у вас дел своих нет.
За это огромное вам спасибо!!!!Побольше таких людей.
Здравствуйте, maxidroms, Вы писали:
M>Использую COM.
M>Память выделяется в COM — объекте.
НИКОГДА не возвращай из COM-методов память, выделенную С++ными средствами.
Только ::TaskMemAlloc() | IMalloc::Alloc()
Иначе огребёшь уйму приключений при первом же маршалинге.
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, maxidroms, Вы писали:
M>>При этом если запускать программу как CTRL-F5 она уже не вылетает при delete. Но если запустить как F5 то она вылетает в дебаг. K>Значит не всё ещё в порядке, хорошы бы конечно разобраться в чём дело. Сделать пошаговую отладку до места где вылетает.
M>>однако если чтроку delete status; перенести после COMObject->Release() или после CoUninitialize() то и вылетать перестает совсем.
K>а CoTaskMemAlloc,CoTaskMemFree пробовали?
Все...огромное спасибо...дейтвительно делать надо все через CoTaskMemAlloc
просто я неправильно немного делал. Сейчас все работатет