ошибка при высвобождении памяти
при выполнении следующего кода
using namespace::std;
#include <stdio.h>
#include <windows.h>
int main()
{
char buffer[]="IT'S A TEST BUFFER? I'LL TEST ITsadasdasdasda\nsdasdasdasdasdasdasdas";
char* tBuff;
char* buff;
tBuff=new char;
buff=new char;
int i=0;
while (buffer!=0)
i++;
tBuff=new char[i+1];
i=0;
while (buffer!=0)
{
tBuff=buffer;
i++;
}
tBuff=0;
cout << "T: " << tBuff << endl;
buff=new char[i+1];
i=0;
while (buffer!=0)
{
buff=buffer;
i++;
}
buff=0;
cout << "B: " << buff << endl;
delete[] tBuff;
delete[] buff;
tBuff=new char;
buff=new char[4];
ZeroMemory(buff,3);
i=0;
int i1=3;
while (buffer!=0)
{
buff=buffer;
i++;
if (i==i1)
{
delete[] tBuff;
tBuff=new char[i+1];
ZeroMemory(tBuff,i);
lstrcpy(tBuff,buff);
ZeroMemory(buff,i1);
delete[] buff;
buff=new char[i+i1+1];
ZeroMemory(buff,i+i1);
lstrcpy(buff,tBuff);
i1+=3;
}
}
cout << "b: " << tBuff << endl;
getchar();
}
в цикле while (buff!=0)
на 2 итерации при высвобождении занимаемой buff'ом памяти происходит ошибка.Прогнал под отладчиком раз 100, так и не понял в чем проблема.
Здрасте.Буду краток(с):
при выполнении следующего кодав цикле while (buff!=0)
на 2 итерации при высвобождении занимаемой buff'ом памяти происходит ошибка.Прогнал под отладчиком раз 100, так и не понял в чем проблема.
О боже!
Ты специально написал такой запутанный код?
Тебе обязательно было делать кучу ненужных действий? Дело в том, что весь код упрощается до нескольких строчек.
Кроме того у тебя множество утечек памяти, неправильного освобождения памяти и возможные выходы за пределы массивов.
using namespace::std;
#include <stdio.h>
#include <windows.h>
int main()
{
char buffer[]="IT'S A TEST BUFFER? I'LL TEST ITsadasdasdasda\nsdasdasdasdasdasdasdas";
char* tBuff;
char* buff;
tBuff=new char;
buff=new char;
int i=0;
while (buffer!=0)
i++;
tBuff=new char[i+1]; // утечка
i=0;
while (buffer!=0)
{
tBuff=buffer;
i++;
}
tBuff=0;
cout << "T: " << tBuff << endl;
buff=new char[i+1]; // утечка
i=0;
while (buffer!=0)
{
buff=buffer;
i++;
}
buff=0;
cout << "B: " << buff << endl;
delete[] tBuff;
delete[] buff;
tBuff=new char;
buff=new char[4];
ZeroMemory(buff,3); // почему обнуляешь 3 из 4 ?
i=0;
int i1=3;
while (buffer!=0)
{
buff=buffer;
i++;
if (i==i1)
{
delete[] tBuff; // неправильное освобождение памяти
tBuff=new char[i+1];
ZeroMemory(tBuff,i); // почему обнуляешь i из i+1 ?
lstrcpy(tBuff,buff); // в buff нет завершающего нуля
ZeroMemory(buff,i1); // почему очищаешь 3 из 4 ?
delete[] buff; // зачем обнулять перед удалением?
buff=new char[i+i1+1];
ZeroMemory(buff,i+i1); // почему обнуляешь i+i1 из i+i1+1 ?
lstrcpy(buff,tBuff); // в tBuff возможен выход за пределы массива и нет завершающего нуля
i1+=3;
}
}
cout << "b: " << tBuff << endl;
getchar();
}
Это какое-то домашнее задание?
Почему бы не использовать стандартные функции работы со C-style строками или даже с std::string ?
А нельзя поточней почему я неправильно выделяю и почему утечки?
Не все спасибо разобрался-глупая логическая ошибка:
память выделял,но занулял не всю и выходил за границу.
Ну вобщем я тренируюсь работать с памятью.
А нельзя поточней почему я неправильно выделяю и почему утечки?
Не все спасибо разобрался-глупая логическая ошибка:
память выделял,но занулял не всю и выходил за границу.
Несколько элементарных правил:
1) в общем случае число операторов new, должно соответствовать числу операторов delete;
2) оператору new должен соответствовать оператор delete, а оператору new[] - оператор delete[];
3) определяй переменные непосредственно перед их использованием;
4) не используй переменные несколько раз для различных целей (это я про твой i);
5) используй интуитивно понятные имена и в одной нотации;
6) не подключай библиотеки без необходимости и если в подключенных уже есть требуемые функции (memset вполне подойдет вместо ZeroMemory, а strcpy вместо lstrcpy).
Давай зарефакторим первую часть твоего кода, т.е.
char* tBuff;
char* buff;
tBuff=new char;
buff=new char;
int i=0;
while (buffer!=0)
i++;
tBuff=new char[i+1]; // утечка
i=0;
while (buffer!=0)
{
tBuff=buffer;
i++;
}
tBuff=0;
cout << "T: " << tBuff << endl;
buff=new char[i+1]; // утечка
i=0;
while (buffer!=0)
{
buff=buffer;
i++;
}
buff=0;
cout << "B: " << buff << endl;
delete[] tBuff;
delete[] buff;
}
превращается в
#include <stdio.h>
using namespace::std;
int main()
{
const char constString[]="IT'S A TEST BUFFER? I'LL TEST ITsadasdasdasda\nsdasdasdasdasdasdasdas";
int stringSize=0;
while (constString[stringSize]!=0) stringSize++;
stringSize++;
char* tempBuffer=new char[stringSize];
for(int i=0; tempBuffer = constString; ++i);
cout << "T: " << tempBuffer << endl;
char* buffer=new char[stringSize];
for(int i=0; buffer = constString; ++i);
cout << "B: " << buffer << endl;
delete[] tempBuffer;
delete[] buffer;
getchar();
}
что можно еще преобразовать к
#include <stdio.h>
using namespace::std;
int main()
{
const char constString[]="IT'S A TEST BUFFER? I'LL TEST ITsadasdasdasda\nsdasdasdasdasdasdasdas4";
char* tempBuffer = new char[strlen(constString)+1];
strcpy(tempBuffer, constString);
cout << "T: " << tempBuffer << endl;
delete[] tempBuffer;
getchar();
}
Я не понимаю, что ты хотел сделать во второй части своего кода. Кстати там у тебя грубая ошибка - ты удаляешь массив (delete[] buff), который ещё используешь.
Я не понимаю, что ты хотел сделать во второй части своего кода. Кстати там у тебя грубая ошибка - ты удаляешь массив (delete[] buff), который ещё используешь.
да но потом его опять выделяю buff=new char[i+i1+1];
А так спасибо большое