борьба с Memory leak
{
LPSTR* Lec;
int Total;
g_Data->GetAllLectors(&Lec, &Total);
for(int y=0; y<Total; y++)
{
ListView->InsertItem(y, Lec[y], y+1); }
delete[] Lec[0]; // Ошибка
}
При выполнении этого кода происходит ошибка при освобождении памяти. С чем это может быть связано?
Функция GetAllLectors просто копирует в Lec некоторые данные.
void DoSome()
{
LPSTR* Lec;
int Total;
g_Data->GetAllLectors(&Lec, &Total);
for(int y=0; y<Total; y++)
{
ListView->InsertItem(y, Lec[y], y+1); }
delete[] Lec[0]; // Ошибка
}
При выполнении этого кода происходит ошибка при освобождении памяти. С чем это может быть связано?
Функция GetAllLectors просто копирует в Lec некоторые данные.
А тем что указатель создан...
LPSTR* Lec; и хер знает на что он указывает. И память под него не отведена.
и создан он не динамически чтобы использовать delete и не является массивов.
И насколько я помню LPSTR это уже указтель... И того ты создаешь указатель на указатель...
кароче LPSTR равносильно char *
И того твой LPSTR* Lec;
Равносилен char ** Lec;
Делай так.
{
char Lec[10];
int Total;
g_Data->GetAllLectors(Lec, &Total);
for(int y=0; y<Total; y++)
{
ListView->InsertItem(y, Lec[y], y+1); }
}
Память сама освободится после выполнения функции.
Ты же создаешь не через new...
Или так если уж ухота удалять все самому....
{
char * Lec = new char[10]
int Total;
g_Data->GetAllLectors(Lec, &Total);
for(int y=0; y<Total; y++)
{
ListView->InsertItem(y, Lec[y], y+1); }
delete[] Lec;
}
Вот полный пример (он не с LPSTR, но аналогичен):
void DoSome()
{
int* pID;
Get1(&pID);
delete[] pID;
}
// это метод класса для работы с данными
void Data::Get1(int ** pID)
{
Get2(pID);
}
// это метод класса, который находится в COM объекте
STDMETHODIMP IData::Get2(int** pID)
{
*pID = new int[nSize];
for(int y=0; y<nSize; y++)
{
(*pID)[y] = 2; // 2 тут ради примера
}
}
так вот, в функции DoSome() происходит ошибка при выполнении delete[] pID;
*pID = new int[10];
for(int y=0; y<10; y++){
(*pID)[y] = 2; // 2 тут ради примера
}
}
void Get1(int ** pID){
Get2(pID);
}
void DoSome(){
int* pID;
Get1(&pID);
delete[] pID;
}
int main(int argc, char* argv[]){
DoSome();
return 0;
}
Прекрасно работает.
Прекрасно работает.
Едрен-батон. Что же делать?
Оно-то работает прекрасно когда все в одном модуле. Но функция IData::Get2(int** pID) находится в СОМ объекте (DLL), и уже при таком раскладе, как я говорил происходит эррор (delete[] pID). Видимо после выхода из функции, память на которую указывает указатель остается в использовании этого СОМ объекта.
Вопрос остается актуален - ЧТО ДЕЛАТЬ?
{
int* pID = new[/*сколько надо*/];
Get1(&pID);
delete[] pID;
}
Ясен пень, ты память выделять не выделяешь, а удаляешь.
{
int* pID = new[/*сколько надо*/];
Get1(&pID);
delete[] pID;
}
Едрена вошь! Как это не выделяю память,
а это вот что: ??
Get2(int** pID){
*pID = new int[10]; // ВОТ ТУТ ПАМЯТЬ ВЫДЕЛЯЕТСЯ
//// skip
}
Выделять память наперед нельзя (точнее не надо)
Адресации внутри объекта ядра, возможно не совпадает с адресацией в твоей программе.
Но это очень врятли... Сомневаюсь...
Нету причин этумо быть. Приведи еще более больший код. С момента создания ком объекта.
Я правда еще в изучении до них не дошел. Но это дело времени. А сейчас вот посмотрю.
Если память была выделена одним менеджером, то и освобождена она должна быть только этим менеджером.
В твоем случае нужно сделать так:
void DoSome()
{
int* pID = Get();
Delete(pID);
}
где Get и Delete - методы, находящиеся в одном модуле, для выделения и освобождения памяти соотв-но.
В каждом модуле (EXE, DLL и т.п.) свой менеджер памяти.
Если память была выделена одним менеджером, то и освобождена она должна быть только этим менеджером.
В твоем случае нужно сделать так:
void DoSome()
{
int* pID = Get();
Delete(pID);
}
где Get и Delete - методы, находящиеся в одном модуле, для выделения и освобождения памяти соотв-но.
Я был прав)))) Даж приятно):D
В каждом модуле (EXE, DLL и т.п.) свой менеджер памяти.
Большое спасибо. Сейчас все работает как часы.