delete[] problem :)

11 отговора 501 прегледа
#1

delete[] problem :)

zdraveite,
imam da pisha zadachka v koqto da se pravi neshto si sus sudurjanieto na tekstov fail vuv SDI Doc/View prilojenie, misleh da napisha za polovin chas, no sega ot dva chasa psuvam i rezultat nikakuv :)

...
char* m_pszTextBuffer;
...
void CZadacha1Doc::Serialize(CArchive& ar)
{

if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
CFile* pFile;
pFile=ar.GetFile();
FileSize=pFile->GetLength();

if (m_bFileLoaded) delete[] m_pszTextBuffer;
m_pszTextBuffer=new char[FileSize];

for(ULONGLONG i=0; i<FileSize;i++) ar >> m_pszTextBuffer[ i ];
m_bFileLoaded=TRUE;
}
}

sled kato e otvarqn veche edin fail, pri otvarqne na drug (i suotvetno povtorno izvikvane na gornata funkciq) reve, che delete[] m_pszTextBuffer raboti v no-mans-land uchastuk, puk az nikude ne promenqm pointera.
imam chuvstvoto, che ot burzane ili nedospivane pravq ili ne pravq neshto mnogo glupavo, pomonete pls :)

Отговор
в отговор на hishtnafca #2

no-mans-land ?

Какво означава no-mans-land ? Уврежда участъка от паметта преди или след динамично заделената памет ?

Отговор
в отговор на hishtnafca #3

opravih go,ne se habete :)

razkarah problema, okaza se, che v druga funkciq pisha s 1 izvun granicite na zadelenata pamet (<= vmesto <), mnogo interesno obache zashto signalizira kato dispose-vam pametta, a ne v momenta v koito uvrejdam heap-a. predpolagam, che proverkata se izvurshva samo nakraq. vsushtnost shte proverq sled sekunda. mersi za pomoshtta

Отговор
в отговор на hishtnafca #4

Re: delete[] problem :)

if (m_bFileLoaded) delete[] m_pszTextBuffer;

Не прави така. Правилното е

if (m_bFileLoaded && (m_pszTextBuffer != NULL))
{
delete[] m_pszTextBuffer;
m_pszTextBuffer = NULL;
}



Отговор
в отговор на Resurrector #5

Re: delete[] problem :)

Тцъ.

По стандарт спокойно можеш да си викаш delete (и delete[]) с нулев поинтер.

Отговор
в отговор на Pesho® #6

Re: delete[] problem :)

да ама, ако ползва ВС++ на Майкрсофт, не е много-много в стандарта.

Не е важно да си маниак, важно е да си луд.
Отговор
в отговор на Hellebore #7

Re: delete[] problem :)

Цитат от MSDN:

В отговор на:

Using delete on a pointer to an object not allocated with new gives unpredictable results. You can, however, use delete on a pointer with the value 0. This provision means that, because new always returns 0 on failure, deleting the result of a failed new operation is harmless.




Отговор
в отговор на Resurrector #8

Аман от проверявачи!

Милен като видя, че не може да ме накара да пиша SAFE_DELETE_ARRAY, което прави това, но е макрос започна да върви след мен и да ми маже кода. Аман от подсигуряване, аман от простотии. Толкова години програмирам и не съм видял проблем с триенето ни в Борланд, ни в МС. Има си стандарт и хората си го спазват (в случая). Това е от грешките, дето на секундата би излязла наяве ако я имаше, следователно няма нужда от преподсигуряване. Пробвай да изтриеш така в C и гърми одма. То и затова само дъртите програмисти с повечко практика на чисто C го правят това.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на hishtnafca #9

Отг: Защо го хваща чак при триене

Всъщност ти си извадил късмет, че ти го е хванало при триене. Това е една от най-шибаните грешки за хващане - грешка един елемент. Работи си перфектно в дебъг (заради падовете) и гърми в релийз. Има един файл crtdbg в който има цял набор функции за контрол на паметта по време на дебъг. Там има една променлива, казваща на колко операции с хийпа да прави цялостна проверка на хийпа за бози. Та тази константа е 1024 по подразбиране. Може да ти се случи да бараш на абсолютно читаво място и да ти тресне. Иди го търси ако не си имал горчив опит. Ако ти се случи имай го предвид - просто слагаш проверките по- на често и го хващаш по-близо. Не ме питай само колко мъки докато го захапа и колко хелп съм изчел.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #10

Re: Аман от проверявачи!

абе ние, старите си знаем и free и delete, ама и на мен ми харесва
след освобождоване да се нулира поинтера. проблема не е в
триенето а в злоупотреба с изтрити пойнтери в release
проверката за 0 преди delete е може би с цел оптимизация
- ако по-честият случай е пойнтера да е 0 :))))

Отговор
в отговор на glamer #11

Re: Аман от проверявачи!

За нулирането не съм казал нищо - щом е member се нулира. Виж за локалните променливи често е излишно и въпреки това ми се случва да го направя. Даже стигам до по-големи крайности - първо нулирам пойнтерите след двете точки в конструктора и след това им заделям памет. Що се отнася до оптимизацията спазвам стария принцип - не оптимизирай преди да профилираш. Затова първият критерий ми е четимостта (която пък е в обратна зависимост от броя редове и условни оператори ) и не бих я развалил заради едно излишно викане на функция. Пък и кодът така е по-кратък ако ще си говорим за оптимизации.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #12

Re: Отг: Защо го хваща чак при триене

pregledah go toq fail... v kraina smetka ne e izmisleno chak tolkova tupo :)) samo da se spomenavashe nqkude s malko-podebeli bukvi kak raboti v deistvitelnost. e, beshe polezno v kraina smetka...

Отговор