New - Delete

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

frofis

Гость
#1
можно так делать

Код:
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)
 
04.09.2006
2 566
2
#2
<!--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]
Если это вопрос, то можно, но очень опасно.
 

grigsoft

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

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

frofis

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

Normann

Well-Known Member
09.08.2007
168
2
#5
А что-нибудь типа такого
Код:
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

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

BVS

Гость
#7
<!--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
Java Team
25.05.2006
1 036
8
#8
<!--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?! в С++?!
 
04.09.2006
2 566
2
#9
<!--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

Гость
#10
<!--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

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

BVS

Гость
#12
<!--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:
 
04.09.2006
2 566
2
#13
Для: BVS
Хочешь пообсуждать поведение своего "сборщика мусора" создай новую тему. Дальнейшие обсуждения касаются только проблемы, поднятой frofis
 
Статус
Закрыто для дальнейших ответов.