Здравствуйте, 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;
А вообще подобные ошибки возникают при записи за пределы массива. Косвенно на это указывает и
"иногда проблемма решается путем подбора рназмеров создаваемой строки"
Здравствуйте, NordWest, Вы писали:
NW>Спасибо! Так вроде работает. Не знал, что delete может так вот писаться. А в каких случаях нужно этим способом пользовться при удалении? При удалении массивов?
Все, что выделено с помощью new должно освобождаться с помощью delete;
Все, что выделено с помощью new [] должно освобождаться с помощью delete [].
Иначе получаем неопределенное поведение.
Это видимо как-то связано с величоной слова и иногда проблемма решается путем подбора рназмеров создаваемой строки. Но это плохое решение. А как правильно сделать, чтобы таких багов не было?
Здравствуйте, 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.
Здравствуйте, 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 при создании получалось обходить эту ошибку. Но так срабатывает не всегда и ладно, если это происходит не в часто вызываемых функциях, а если нет, то при постоянном вызове память, используемая приложением растет и растет.
Здравствуйте, 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 при создании получалось обходить эту ошибку. Но так срабатывает не всегда и ладно, если это происходит не в часто вызываемых функциях, а если нет, то при постоянном вызове память, используемая приложением растет и растет.
Здравствуйте, 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 может так вот писаться. А в каких случаях нужно этим способом пользовться при удалении? При удалении массивов?
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, NordWest, Вы писали:
NW>>Спасибо! Так вроде работает. Не знал, что delete может так вот писаться. А в каких случаях нужно этим способом пользовться при удалении? При удалении массивов?
B>Все, что выделено с помощью new должно освобождаться с помощью delete; B>Все, что выделено с помощью new [] должно освобождаться с помощью delete []. B>Иначе получаем неопределенное поведение.