Дали е коректно...
30 отговора
1991 прегледа
Re: Дали е коректно...
На практика си мисля, че може и да няма проблем. В крайна сметка delete оператора вика free също. Но не бих направил такова нещо.
А иначе, на теория алгоритмите за заделяне/освобождаване на памет чрез new и delete, може да са различни от malloc/free и тогава ще има undefined behaviour.
А иначе, на теория алгоритмите за заделяне/освобождаване на памет чрез new и delete, може да са различни от malloc/free и тогава ще има undefined behaviour.
Re: Дали е коректно...
Различни механизми, с различна идея. malloc/free просто заделят/освобождават памет, new/delete освен това осигуряват извикване на конструктор/деструктор т.е. освен памет има инициализация/почистване. delete очаква някаква служебна информация, записана от new някъде си, за да знае как да свърши работата. Тази информация е в някакъв формат и няма гаранция (по-скоро има за обратното), че malloc използва същия формат.
Re: Дали е коректно...
Сега си трейснах извикването на new и delete оператора във vs.net, там в delete и new се правят разни неща, които не са ми ясни, обаче ще е лош експеримент да не се направят при заделянето и да се направят при освобождаването. Иначе във VS 6.0 изглежда по-надеждно.
Re: Дали е коректно...
Очевидно, че с malloc не се създават обекти, а само прости масиви. Въпроса е до колко е коректно да се чистят тия масиви с делете. Дори да има съпровождаща информация към всеки блок, тя би трябвало да е асоциирана по указател. Тоест, ако делете не намира въпросната информация (блокът не е заделен с ню), би следвало да не извършва допълнителните действия и съответно да преминава директно към фрее.
Re: Дали е коректно...
"Тоест, ако делете не намира въпросната информация (блокът не е заделен с ню), би следвало да не извършва допълнителните действия и съответно да преминава директно към фрее."
Това никой не го гарантира. Малко безсмислено ми се струва - щом си заделил с malloc просто извикай free. Какво налага да викаш delete?
Това никой не го гарантира. Малко безсмислено ми се струва - щом си заделил с malloc просто извикай free. Какво налага да викаш delete?
За чий му е на попа тромпет?
А ми дай поне една смислена причина да заделяш с малок и да триеш с делете?
Има по интересни начини да си направиш живота труден :)
Bеer? Mоre?
Плацебото
Има по интересни начини да си направиш живота труден :)
Bеer? Mоre?
Плацебото
Re: Дали е коректно...
абе ползвам _strdup, той вика в себе си malloc, пък после стригна се разкарва с делете. Явно ще се наложи да пренаписвам стрдуп или да минавам навсякъде да променям делете с фрее.
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
//
// 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
Re: strnewdup
мерси, направих го вече
само че ти как си го представяш това s = ""; ?
само че ти как си го представяш това s = ""; ?