ошибка при delete
От: maxidroms Россия  
Дата: 05.04.05 12:32
Оценка:
Вот представлен следущий код:

ENUM_SERVICE_STATUS *status;
DWORD szReturned;
MyFunction(status,szReturned);
for (int i=0;i<(int)szReturned;i++)
{
cout << status[i].lpDisplayName << endl;
}
delete status;


MyFunction выглядит след. образом.

void MyFunction(ENUM_SERVICE_STATUS *&status,&szReturned)
{
status=new ENUM_SERVICE_STATUS[100];
szReturned=100;
}

Функция отрабатывает нормально. в цикле после функции я получаю всю необходимую инфу.

но почему у меня вылетает программа на delete. если его нет тот все ОК. Но тогда ведь паметь не освобождается.
Что я неправильно сделал?
Re: ошибка при delete
От: Аноним  
Дата: 05.04.05 12:33
Оценка:
Здравствуйте, maxidroms, Вы писали:

delete []
Re: ошибка при delete
От: korzhik Россия  
Дата: 05.04.05 12:33
Оценка:
Здравствуйте, maxidroms, Вы писали:

M>Вот представлен следущий код:


  delete [] status;
Re[2]: ошибка при delete
От: maxidroms Россия  
Дата: 05.04.05 12:37
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, maxidroms, Вы писали:


M>>Вот представлен следущий код:


K>
K>  delete [] status;
K>


delete [] status;

та же ошибка!

пишет как и раньше
File dbgheap.c
line 1132

expression _CrtIsValidHeapPointer(pUserData)

Вылетает на ASSERT в этом файле.
Re: ошибка при delete
От: Bell Россия  
Дата: 05.04.05 12:39
Оценка:
Здравствуйте, maxidroms, Вы писали:

Если для выделения используешь new[], то освобождай с помощью delete []. Иначе — неопределенное поведение.
Любите книгу — источник знаний (с) М.Горький
Re[2]: ошибка при delete
От: maxidroms Россия  
Дата: 05.04.05 12:40
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, maxidroms, Вы писали:


B>Если для выделения используешь new[], то освобождай с помощью delete []. Иначе — неопределенное поведение.




Понимаю но....

delete [] status;

та же ошибка!

пишет как и раньше
File dbgheap.c
line 1132

expression _CrtIsValidHeapPointer(pUserData)

Вылетает на ASSERT в этом файле.
Re[3]: ошибка при delete
От: korzhik Россия  
Дата: 05.04.05 12:42
Оценка:
Здравствуйте, 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 в этом файле.


у тебя одна программа или используешь dll?
Re[4]: ошибка при delete
От: maxidroms Россия  
Дата: 05.04.05 12:43
Оценка:
Здравствуйте, korzhik, Вы писали:


K>у тебя одна программа или используешь dll?



Использую COM.

Память выделяется в COM — объекте.
Re[5]: ошибка при delete
От: SergeyL Россия  
Дата: 05.04.05 12:54
Оценка:
Здравствуйте, maxidroms, Вы писали:


M>Использую COM.


M>Память выделяется в COM — объекте.



void MyFunction(ENUM_SERVICE_STATUS *&status,&szReturned)


Так эта функция — метод COM интерфейса ?
Re[2]: ошибка при delete
От: nabor Россия  
Дата: 05.04.05 12:55
Оценка:
Здравствуйте, Bell, Вы писали:

B>Если для выделения используешь new[], то освобождай с помощью delete []. Иначе — неопределенное поведение.

Не совсем так. new[] выделяет массив, а delete [] вызывает для каждого из удаляемых объектов деструктор.
Убиваю принцесс, спасаю драконов...
Re[6]: ошибка при delete
От: maxidroms Россия  
Дата: 05.04.05 12:58
Оценка:
Здравствуйте, SergeyL, Вы писали:

SL>Здравствуйте, maxidroms, Вы писали:



M>>Использую COM.


M>>Память выделяется в COM — объекте.



SL>
SL>void MyFunction(ENUM_SERVICE_STATUS *&status,&szReturned)
SL>


SL>Так эта функция — метод COM интерфейса ?



Совершенно верно. Я просто сокращенно написал для читабельности на форуме.

на самом деле все выглядит так:

cout << "Starting service " << "messenger" << endl;
ENUM_SERVICE_STATUS *status;
DWORD szReturned;
pManageService->IWantEnumService("maxidrom",status,szReturned);
for (int i=0;i<(int)szReturned;i++)
{
cout << status[i].lpDisplayName << endl;
}
delete [] status;
cout << "Releasing instance" << endl;
pManageService->Release();

cout << "Shuting down COM" << endl;
CoUninitialize();


Простите если это сокращение уменьшило объективность.
Я считал это не важной деталью.(Знать где упасть можно было бы сена подстелить)
Так это что то меняет? Можете что то посоветовать чтобы освобождать память без ошибок?
Re[7]: ошибка при delete
От: SergeyL Россия  
Дата: 05.04.05 13:07
Оценка:
Здравствуйте, 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>Так это что то меняет? Можете что то посоветовать чтобы освобождать память без ошибок?

Возможно, клиентский код не может корректно удалить Ваш массив, потому что не знает его размера?
Попробуйте выделить память в клиенте, а не в сервере.
Re[5]: ошибка при delete
От: korzhik Россия  
Дата: 05.04.05 13:13
Оценка:
Здравствуйте, maxidroms, Вы писали:

M>Здравствуйте, korzhik, Вы писали:



K>>у тебя одна программа или используешь dll?


M>Использую COM.

M>Память выделяется в COM — объекте.

скорей всего проблема в том что вы используете статическую линковку с CRT. в итоге у вас получается две кучи. В одной куче вы выделяете память, а вдругой освобождаете, поэтому и происходит ошибка. Используйте динамическую линковку с CRT (/MDd, /MD) или используйте к примеру CoTaskMemAlloc,CoTaskMemFree
Re[6]: ошибка при delete
От: maxidroms Россия  
Дата: 05.04.05 14:15
Оценка:
Здравствуйте, 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() то и вылетать перестает совсем.
Re[3]: ошибка при delete
От: MaximE Великобритания  
Дата: 05.04.05 14:23
Оценка:
nabor wrote:

> B>Если для выделения используешь new[], то освобождай с помощью delete []. Иначе — неопределенное поведение.

> Не совсем так.

Что не совсем так? Стандарт гарантирует undefined behavior.

> new[] выделяет массив


... и затем вызывает дефолтный конструктор у не POD типов.

> , а delete [] вызывает для каждого из удаляемых объектов деструктор.


... и удаляет память.

(речь идет о ключевых словах, а не об одноименных операторах)

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[7]: ошибка при delete
От: korzhik Россия  
Дата: 05.04.05 14:25
Оценка:
Здравствуйте, maxidroms, Вы писали:

M>При этом если запускать программу как CTRL-F5 она уже не вылетает при delete. Но если запустить как F5 то она вылетает в дебаг.

Значит не всё ещё в порядке, хорошы бы конечно разобраться в чём дело. Сделать пошаговую отладку до места где вылетает.

M>однако если чтроку delete status; перенести после COMObject->Release() или после CoUninitialize() то и вылетать перестает совсем.


а CoTaskMemAlloc,CoTaskMemFree пробовали?
Re[8]: ошибка при delete
От: maxidroms Россия  
Дата: 05.04.05 14:31
Оценка:
Здравствуйте, korzhik, Вы писали:


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);
так?

Если да то он на этой строчке отваливается. Не может так выделить
Re[8]: ошибка при delete
От: maxidroms Россия  
Дата: 05.04.05 14:34
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, maxidroms, Вы писали:


M>>При этом если запускать программу как CTRL-F5 она уже не вылетает при delete. Но если запустить как F5 то она вылетает в дебаг.

K>Значит не всё ещё в порядке, хорошы бы конечно разобраться в чём дело. Сделать пошаговую отладку до места где вылетает.

M>>однако если чтроку delete status; перенести после COMObject->Release() или после CoUninitialize() то и вылетать перестает совсем.


K>а CoTaskMemAlloc,CoTaskMemFree пробовали?




Слушайте а вы вообще работаете или в инете сидите? У нас почти как переписка по чату!
Мало людей кто так оперативно отвечает и так занят этой проблемой. Как будто у вас дел своих нет.

За это огромное вам спасибо!!!!Побольше таких людей.
Re[5]: ошибка при delete
От: Кодт Россия  
Дата: 05.04.05 14:45
Оценка:
Здравствуйте, maxidroms, Вы писали:

M>Использую COM.


M>Память выделяется в COM — объекте.


НИКОГДА не возвращай из COM-методов память, выделенную С++ными средствами.
Только ::TaskMemAlloc() | IMalloc::Alloc()
Иначе огребёшь уйму приключений при первом же маршалинге.
Перекуём баги на фичи!
Re[8]: ошибка при delete
От: maxidroms Россия  
Дата: 05.04.05 15:14
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, maxidroms, Вы писали:


M>>При этом если запускать программу как CTRL-F5 она уже не вылетает при delete. Но если запустить как F5 то она вылетает в дебаг.

K>Значит не всё ещё в порядке, хорошы бы конечно разобраться в чём дело. Сделать пошаговую отладку до места где вылетает.

M>>однако если чтроку delete status; перенести после COMObject->Release() или после CoUninitialize() то и вылетать перестает совсем.


K>а CoTaskMemAlloc,CoTaskMemFree пробовали?


Все...огромное спасибо...дейтвительно делать надо все через CoTaskMemAlloc

просто я неправильно немного делал. Сейчас все работатет
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.