• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

New - Delete

  • Автор темы Автор темы frofis
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
F

frofis

можно так делать

Код:
int len = 20; 
char * var = new char[len];
var = fun1(var);
var = fun2(var);
delete [] var; 

где 

char * fun1(char *var) 
{ 
int len1 = 11; 
char * buf = new char[len1]; 
.... 
delete [] var;
return buf;
} 

char * fun2(char *var) 
{ 
int len2 = 12; 
char * buf = new char[len2]; 
.... 
delete [] var;
return buf;
}
я же фактически удаляю глобальный массив var
а если на входе и на выходе имена переменных не будут совпадать
или переменная на выходе требует специфицеского удаления
(например при вызове из dll)
 
<!--QuoteBegin-frofis+18:09:2007, 11:24 -->
<span class="vbquote">(frofis @ 18:09:2007, 11:24 )</span><!--QuoteEBegin-->можно так делать
[snapback]78588" rel="nofollow" target="_blank[/snapback]​
[/quote]
Если это вопрос, то можно, но очень опасно.
 
Чуть расширю предыдущий ответ, почему опасно. В принципе, код этот работать будет без проблем. Проблема здесь в дизайне - функция неявно накладывает множество ограничений на ее использование, и рано или поздно ты сам об одном из ограничений забудешь. Ничего не мешает допустить одну из следующих ошибок:
Код:
  fun1(var);
char* NewVar = fun1(var);
var = fun1("Const string");
char localStr[20];
var = fun1(localStr);
Каждый вызов - по ошибке, и это еще далеко не все варианты. В принципе, фунrции такие вполне можно писать, тот же reallос работает таким образом, но это должно четко оговариваться синтаксисом, не допуская вариантов вызовов.

И это я еще не говорю о проблемах с меж-модульным взаимодействием - если эту функцию вы складываете в длл, то думайте кто будет ее вызывать - всегда ли он может сделать new, а не alloc\GlocalAlloc
 
И это я еще не говорю о проблемах с меж-модульным взаимодействием - если эту функцию вы складываете в длл, то думайте кто будет ее вызывать - всегда ли он может сделать new, а не alloc\GlocalAlloc
А что-нибудь типа такого
Код:
fun1(char **var) 
{ 
int len1 = 11; 
char * buf = new char[len1]; 
.... 
delete [] *var;
*var = new char[len1];
memcpy(*var, buf, len1);
}
только в memcpy - Access Violation
что не так?
 
А что-нибудь типа такого
Код:
fun1(char **var) 
{ 
int len1 = 11; 
char * buf = new char[len1]; 
.... 
delete [] *var;
*var = new char[len1];
memcpy(*var, buf, len1);
}
только в memcpy - Access Violation
что не так?
А *var у тебя достаточной длинны? Или смотри на то что подставляешь в char **var
 
А *var у тебя достаточной длинны? Или смотри на то что подставляешь в char **var
В первом посте специально для вар размер поставлен больше всех, но в последнем я пытаюсь перераспределить память, так что длина не должна иметь значение, т.к. я и вар и буф делаю одинакового размера.
 
<!--QuoteBegin-European+18:09:2007, 10:31 -->
<span class="vbquote">(European @ 18:09:2007, 10:31 )</span><!--QuoteEBegin-->Если это вопрос, то можно, но очень опасно.
[snapback]78589" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ага, особенно если вспомнить про "сборщика мусора", заметить что в функции паметь выделена и не освобождена, и он рад стараться B) . У меня такое уже было.
 
<!--QuoteBegin-BVS+20:09:2007, 17:10 -->
<span class="vbquote">(BVS @ 20:09:2007, 17:10 )</span><!--QuoteEBegin-->Ага, особенно если вспомнить про "сборщика мусора", заметить что в функции паметь выделена и не освобождена, и он рад стараться smile.gif . У меня такое уже было.
[snapback]79004" rel="nofollow" target="_blank[/snapback]​
[/quote]

GC?! в С++?!
 
<!--QuoteBegin-BVS+20:09:2007, 18:10 -->
<span class="vbquote">(BVS @ 20:09:2007, 18:10 )</span><!--QuoteEBegin-->Ага, особенно если вспомнить про "сборщика мусора",
[snapback]79004" rel="nofollow" target="_blank[/snapback]​
[/quote]
Даже если и не вспоминать, особенно про, то чего не существует
 
<!--QuoteBegin-European+20:09:2007, 20:50 -->
<span class="vbquote">(European @ 20:09:2007, 20:50 )</span><!--QuoteEBegin-->чего не существует
[snapback]79023" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ну ненаю,
а это, которое не существует, у меня в проекте на Visual C++ 6.5 удалила весь динамический массив. :)
 
Для: BVS
Visual C++ 6.5? Что это вообще за зверь такой?
UPD: Судя во всему, 6.0 SP5. Нет в нем сборщика мусора, и не было никогда.
 
<!--QuoteBegin-Pasha+21:09:2007, 16:19 -->
<span class="vbquote">(Pasha @ 21:09:2007, 16:19 )</span><!--QuoteEBegin-->Нет в нем сборщика мусора, и не было никогда.
[snapback]79142" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ну ладно, нет и не надо.

PS: У меня диск от Alex Soft приебрел в 2000 году. Проверял, специально: содавал объекты, и в отдладчики смотрел что с ними происходить в конце процедуры (без явного удаления деструктор всеравно вызывается.)
Также пропадали и динамические данные.
Наверно пираты постарались. :rolleyes:
 
Для: BVS
Хочешь пообсуждать поведение своего "сборщика мусора" создай новую тему. Дальнейшие обсуждения касаются только проблемы, поднятой frofis
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab