Дали е коректно...

30 отговора 1991 прегледа
#1

Дали е коректно...

нещо, заделено с malloc, да се чисти после с delete?



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

Re: Дали е коректно...

дебиш, що? :)



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

Re: Дали е коректно...

На практика си мисля, че може и да няма проблем. В крайна сметка delete оператора вика free също. Но не бих направил такова нещо.

А иначе, на теория алгоритмите за заделяне/освобождаване на памет чрез new и delete, може да са различни от malloc/free и тогава ще има undefined behaviour.

Отговор
в отговор на Pekoнcтpykтop #5

Re: Дали е коректно...

Различни механизми, с различна идея. malloc/free просто заделят/освобождават памет, new/delete освен това осигуряват извикване на конструктор/деструктор т.е. освен памет има инициализация/почистване. delete очаква някаква служебна информация, записана от new някъде си, за да знае как да свърши работата. Тази информация е в някакъв формат и няма гаранция (по-скоро има за обратното), че malloc използва същия формат.

Отговор
в отговор на z-order #6

Re: Дали е коректно...

Сега си трейснах извикването на new и delete оператора във vs.net, там в delete и new се правят разни неща, които не са ми ясни, обаче ще е лош експеримент да не се направят при заделянето и да се направят при освобождаването. Иначе във VS 6.0 изглежда по-надеждно.

Отговор
в отговор на Paдo #7

Re: Дали е коректно...

Очевидно, че с malloc не се създават обекти, а само прости масиви. Въпроса е до колко е коректно да се чистят тия масиви с делете. Дори да има съпровождаща информация към всеки блок, тя би трябвало да е асоциирана по указател. Тоест, ако делете не намира въпросната информация (блокът не е заделен с ню), би следвало да не извършва допълнителните действия и съответно да преминава директно към фрее.



Отговор
в отговор на Pekoнcтpykтop #8

Re: Дали е коректно...

"Тоест, ако делете не намира въпросната информация (блокът не е заделен с ню), би следвало да не извършва допълнителните действия и съответно да преминава директно към фрее."

Това никой не го гарантира. Малко безсмислено ми се струва - щом си заделил с malloc просто извикай free. Какво налага да викаш delete?

Отговор
в отговор на Pekoнcтpykтop #9

За чий му е на попа тромпет?

А ми дай поне една смислена причина да заделяш с малок и да триеш с делете?
Има по интересни начини да си направиш живота труден :)

Bеer? Mоre?
Плацебото
Отговор
в отговор на Paдo #10

Re: Дали е коректно...

абе ползвам _strdup, той вика в себе си malloc, пък после стригна се разкарва с делете. Явно ще се наложи да пренаписвам стрдуп или да минавам навсякъде да променям делете с фрее.



Отговор
в отговор на Pekoнcтpykтop #12

strnewdup

Напиши си собствена функция, примерно (OWL):

//
// Make a duplicate of a 0-terminated string using new char[]
//
char* strnewdup(const char* s, size_t allocSize)
{
if (!s)
s = "";
int alloc = max(_tcslen(s)+1, allocSize);
return _tcscpy(new char[alloc], s);
}

А най-добре, използвай CString или std::string

Отговор
в отговор на Pekoнcтpykтop #13

Re: Дали е коректно...

strdup не го ли забраниха със закон?

Лека нощ
Отговор
в отговор на Maтa Kocмaтa #15

Re: Дали е коректно...

Ако те прочете някой BSD девелопер лошо ти се пише :)

Отговор
в отговор на KrassiB #16

Re: strnewdup

мерси, направих го вече
само че ти как си го представяш това s = ""; ?



Отговор
в отговор на Pekoнcтpykтop #17

а ако new/delete са предефинирани?

както е например в debug, кво правиш?

Отговор
в отговор на ~!@$%amp;^*()_+ #18

Re: а ако new/delete са предефинирани?

в смисъл?



Отговор
в отговор на Pekoнcтpykтop #19

Re: strnewdup

Че какъв проблем виждаш - и двете са const char*?

Отговор
в отговор на KrassiB #20

Re: strnewdup

абе точно заради const-а нещо се усъмних, ма се компилира.



Отговор