Здравствуйте, 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
просто я неправильно немного делал. Сейчас все работатет
Здравствуйте, MaximE, Вы писали:
>> Не совсем так. ME>Что не совсем так? Стандарт гарантирует undefined behavior. >> new[] выделяет массив ME>... и затем вызывает дефолтный конструктор у не POD типов. >> , а delete [] вызывает для каждого из удаляемых объектов деструктор. ME>... и удаляет память. ME>(речь идет о ключевых словах, а не об одноименных операторах)
Что ж, видимо я не неправильно понял Ваш первый пост. Хотя это уже флейм. Из сказанного Вами следует, что всегда надо после new [] освобождать память при помощи delete [].
Здравствуйте, nabor, Вы писали:
N>Что ж, видимо я не неправильно понял Ваш первый пост. Хотя это уже флейм. Из сказанного Вами следует, что всегда надо после new [] освобождать память при помощи delete [].
Пост был мой , и поняли Вы его правильно — после new [] освобождать память нужно при помощи delete [].
Тема эта обсуждалась не раз, и не два, так что все подробности можно легко найти в поиске.
Здравствуйте, maxidroms, Вы писали:
M>Слушайте а вы вообще работаете или в инете сидите? У нас почти как переписка по чату!
Работаю конечно.
M>Мало людей кто так оперативно отвечает и так занят этой проблемой. Как будто у вас дел своих нет.
Дела есть. Просто работать без перерыва сложно.
Если есть возможность работаю примерно в режиме 20/5 (20 минут работаю 5 минут отдыхаю)
На вашу проблему я много времени не потратил.
M>За это огромное вам спасибо!!!!Побольше таких людей.
Тут таких много