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)
 
E

European

<!--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]
Если это вопрос, то можно, но очень опасно.
 
G

grigsoft

Чуть расширю предыдущий ответ, почему опасно. В принципе, код этот работать будет без проблем. Проблема здесь в дизайне - функция неявно накладывает множество ограничений на ее использование, и рано или поздно ты сам об одном из ограничений забудешь. Ничего не мешает допустить одну из следующих ошибок:
Код:
  fun1(var);
char* NewVar = fun1(var);
var = fun1("Const string");
char localStr[20];
var = fun1(localStr);
Каждый вызов - по ошибке, и это еще далеко не все варианты. В принципе, фунrции такие вполне можно писать, тот же reallос работает таким образом, но это должно четко оговариваться синтаксисом, не допуская вариантов вызовов.

И это я еще не говорю о проблемах с меж-модульным взаимодействием - если эту функцию вы складываете в длл, то думайте кто будет ее вызывать - всегда ли он может сделать new, а не alloc\GlocalAlloc
 
F

frofis

И это я еще не говорю о проблемах с меж-модульным взаимодействием - если эту функцию вы складываете в длл, то думайте кто будет ее вызывать - всегда ли он может сделать 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
что не так?
 
N

Normann

А что-нибудь типа такого
Код:
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
 
F

frofis

А *var у тебя достаточной длинны? Или смотри на то что подставляешь в char **var
В первом посте специально для вар размер поставлен больше всех, но в последнем я пытаюсь перераспределить память, так что длина не должна иметь значение, т.к. я и вар и буф делаю одинакового размера.
 
B

BVS

<!--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) . У меня такое уже было.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
<!--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?! в С++?!
 
E

European

<!--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]
Даже если и не вспоминать, особенно про, то чего не существует
 
B

BVS

<!--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 удалила весь динамический массив. :)
 
P

Pasha

Для: BVS
Visual C++ 6.5? Что это вообще за зверь такой?
UPD: Судя во всему, 6.0 SP5. Нет в нем сборщика мусора, и не было никогда.
 
B

BVS

<!--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:
 
E

European

Для: BVS
Хочешь пообсуждать поведение своего "сборщика мусора" создай новую тему. Дальнейшие обсуждения касаются только проблемы, поднятой frofis
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!