New - Delete

Тема в разделе "Общие вопросы по С и С++", создана пользователем frofis, 18 сен 2007.

Статус темы:
Закрыта.
  1. frofis

    frofis Гость

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

    Код (Text):
    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)
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    Если это вопрос, то можно, но очень опасно.
     
  3. grigsoft

    grigsoft Well-Known Member

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

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

    frofis Гость

    А что-нибудь типа такого
    Код (Text):
    fun1(char **var)
    {
    int len1 = 11;
    char * buf = new char[len1];
    ....
    delete [] *var;
    *var = new char[len1];
    memcpy(*var, buf, len1);
    }
    только в memcpy - Access Violation
    что не так?
     
  5. Normann

    Normann Well-Known Member

    Регистрация:
    9 авг 2007
    Сообщения:
    168
    Симпатии:
    2
    А *var у тебя достаточной длинны? Или смотри на то что подставляешь в char **var
     
  6. frofis

    frofis Гость

    В первом посте специально для вар размер поставлен больше всех, но в последнем я пытаюсь перераспределить память, так что длина не должна иметь значение, т.к. я и вар и буф делаю одинакового размера.
     
  7. BVS

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    <!--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?! в С++?!
     
  9. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    Даже если и не вспоминать, особенно про, то чего не существует
     
  10. BVS

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

    Pasha Гость

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

    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:
     
  13. European

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

Поделиться этой страницей