С++ free(char*) ошибка.
От: NordWest Россия  
Дата: 11.09.06 07:15
Оценка:
Почему постоянно возникают проблеммы с удалением строк?

Вот такой код, например:

char *zero1;
zero1 = new char[32];

...

free(zero0);

На free вылетает ошибка:
"
Debug Assertion Failed!

Program:....exe
File: dbgheap.c
Line: 1252

Expression: _CrtIsValidHeapPointer(pUserData)
...
Abort|Retry|Ignore
"

Это видимо как-то связано с величоной слова и иногда проблемма решается путем подбора рназмеров создаваемой строки. Но это плохое решение. А как правильно сделать, чтобы таких багов не было?
Re: С++ free(char*) ошибка.
От: Draqon  
Дата: 11.09.06 07:18
Оценка: +1
Здравствуйте, NordWest, Вы писали:

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


NW>Вот такой код, например:


NW> char *zero1;

NW> zero1 = new char[32];

NW>...


NW>free(zero0);


NW>На free вылетает ошибка:

NW>"
NW>Debug Assertion Failed!

NW>Program:....exe

NW>File: dbgheap.c
NW>Line: 1252

NW>Expression: _CrtIsValidHeapPointer(pUserData)

NW>...
NW>Abort|Retry|Ignore
NW>"

Если имелось в виду free(zero1), то его надо удалять с помощью delete[], т.к. он был выделен через new[].
Re: С++ free(char*) ошибка.
От: ZhyD  
Дата: 11.09.06 07:23
Оценка:
Здравствуйте, NordWest, Вы писали:

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


NW>Вот такой код, например:


NW> char *zero1;

NW> zero1 = new char[32];

NW>...


NW>free(zero0);


NW>На free вылетает ошибка:

NW>"
NW>Debug Assertion Failed!

NW>Program:....exe

NW>File: dbgheap.c
NW>Line: 1252

NW>Expression: _CrtIsValidHeapPointer(pUserData)

NW>...
NW>Abort|Retry|Ignore
NW>"

NW>Это видимо как-то связано с величоной слова и иногда проблемма решается путем подбора рназмеров создаваемой строки. Но это плохое решение. А как правильно сделать, чтобы таких багов не было?


Выделяется память через с++, а освобождается через функцию библиотеки с.
Использую что нибудь одно malloc\free или new\delete.
Re[2]: С++ free(char*) ошибка.
От: NordWest Россия  
Дата: 11.09.06 07:27
Оценка:
Здравствуйте, Draqon, Вы писали:

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


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


NW>>Вот такой код, например:


NW>> char *zero1;

NW>> zero1 = new char[32];

NW>>...


NW>>free(zero0);


NW>>На free вылетает ошибка:

NW>>"
NW>>Debug Assertion Failed!

NW>>Program:....exe

NW>>File: dbgheap.c
NW>>Line: 1252

NW>>Expression: _CrtIsValidHeapPointer(pUserData)

NW>>...
NW>>Abort|Retry|Ignore
NW>>"

D>Если имелось в виду free(zero1), то его надо удалять с помощью delete[], т.к. он был выделен через new[].


Да, это имелось в виду, но с delete тоже не каитит. По началу-то и было у меня везде delete в таких случаях, но отчего-то они приводили к таким ошибкам. По разному попробовал и при использовании free и подборе длины массива char при создании получалось обходить эту ошибку. Но так срабатывает не всегда и ладно, если это происходит не в часто вызываемых функциях, а если нет, то при постоянном вызове память, используемая приложением растет и растет.
Re[3]: С++ free(char*) ошибка.
От: NordWest Россия  
Дата: 11.09.06 07:34
Оценка:
Здравствуйте, NordWest, Вы писали:

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


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


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


NW>>>Вот такой код, например:


NW>>> char *zero1;

NW>>> zero1 = new char[32];

NW>>>...


NW>>>free(zero0);


NW>>>На free вылетает ошибка:

NW>>>"
NW>>>Debug Assertion Failed!

NW>>>Program:....exe

NW>>>File: dbgheap.c
NW>>>Line: 1252

NW>>>Expression: _CrtIsValidHeapPointer(pUserData)

NW>>>...
NW>>>Abort|Retry|Ignore
NW>>>"

D>>Если имелось в виду free(zero1), то его надо удалять с помощью delete[], т.к. он был выделен через new[].


NW>Да, это имелось в виду, но с delete тоже не каитит. По началу-то и было у меня везде delete в таких случаях, но отчего-то они приводили к таким ошибкам. По разному попробовал и при использовании free и подборе длины массива char при создании получалось обходить эту ошибку. Но так срабатывает не всегда и ладно, если это происходит не в часто вызываемых функциях, а если нет, то при постоянном вызове память, используемая приложением растет и растет.


Только вот ошибка при этом меняется на:


File: dbgdel.c
Line: 52


Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Re: С++ free(char*) ошибка.
От: Bell Россия  
Дата: 11.09.06 07:36
Оценка: 2 (1)
Здравствуйте, NordWest, Вы писали:

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


NW>Вот такой код, например:


NW> char *zero1;

NW> zero1 = new char[32];

NW>...


NW>free(zero0);


NW>На free вылетает ошибка:

NW>"
NW>Debug Assertion Failed!

NW>Program:....exe

NW>File: dbgheap.c
NW>Line: 1252

NW>Expression: _CrtIsValidHeapPointer(pUserData)

NW>...
NW>Abort|Retry|Ignore
NW>"

NW>Это видимо как-то связано с величоной слова и иногда проблемма решается путем подбора рназмеров создаваемой строки. Но это плохое решение. А как правильно сделать, чтобы таких багов не было?


Если имеелось ввиду free(zero1);, то удалять необходимо с помощью delete []:

delete [] zero1;


А вообще подобные ошибки возникают при записи за пределы массива. Косвенно на это указывает и

"иногда проблемма решается путем подбора рназмеров создаваемой строки"

Любите книгу — источник знаний (с) М.Горький
Re[2]: С++ free(char*) ошибка.
От: NordWest Россия  
Дата: 11.09.06 07:53
Оценка:
Здравствуйте, Bell, Вы писали:

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


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


NW>>Вот такой код, например:


NW>> char *zero1;

NW>> zero1 = new char[32];

NW>>...


NW>>free(zero0);


NW>>На free вылетает ошибка:

NW>>"
NW>>Debug Assertion Failed!

NW>>Program:....exe

NW>>File: dbgheap.c
NW>>Line: 1252

NW>>Expression: _CrtIsValidHeapPointer(pUserData)

NW>>...
NW>>Abort|Retry|Ignore
NW>>"

NW>>Это видимо как-то связано с величоной слова и иногда проблемма решается путем подбора рназмеров создаваемой строки. Но это плохое решение. А как правильно сделать, чтобы таких багов не было?


B>Если имеелось ввиду free(zero1);, то удалять необходимо с помощью delete []:


B>
B>delete [] zero1;
B>


B>А вообще подобные ошибки возникают при записи за пределы массива. Косвенно на это указывает и

B>

B>"иногда проблемма решается путем подбора рназмеров создаваемой строки"


Спасибо! Так вроде работает. Не знал, что delete может так вот писаться. А в каких случаях нужно этим способом пользовться при удалении? При удалении массивов?
Re[3]: С++ free(char*) ошибка.
От: Bell Россия  
Дата: 11.09.06 07:56
Оценка: 2 (1)
Здравствуйте, NordWest, Вы писали:

NW>Спасибо! Так вроде работает. Не знал, что delete может так вот писаться. А в каких случаях нужно этим способом пользовться при удалении? При удалении массивов?


Все, что выделено с помощью new должно освобождаться с помощью delete;
Все, что выделено с помощью new [] должно освобождаться с помощью delete [].
Иначе получаем неопределенное поведение.
Любите книгу — источник знаний (с) М.Горький
Re[4]: С++ free(char*) ошибка.
От: NordWest Россия  
Дата: 11.09.06 08:02
Оценка:
Здравствуйте, Bell, Вы писали:

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


NW>>Спасибо! Так вроде работает. Не знал, что delete может так вот писаться. А в каких случаях нужно этим способом пользовться при удалении? При удалении массивов?


B>Все, что выделено с помощью new должно освобождаться с помощью delete;

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

Большое спасибо, Bell!
Re[5]: С++ free(char*) ошибка.
От: Bell Россия  
Дата: 11.09.06 08:04
Оценка:
Здравствуйте, NordWest, Вы писали:


NW>Большое спасибо, Bell!

На здоровье
Заходите еще
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.