powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / auto_ptr или new + delete
25 сообщений из 74, страница 2 из 3
auto_ptr или new + delete
    #34396630
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Наш мир не совершенен и auto_ptr тоже. Наппример с масивами он не работает. Однако же это средство стандартное, а по мне армейский принцип: хоть безобразно, зато единообразно. приобретает вса большую актуальность.
2) Должен разочаровать, в вашем понимании new ненормален. Он позволяет себе при нехватке памяти генерировать bad_alloc. Так что присоединяйтесь
C++
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34396798
а по мне армейский принцип: хоть безобразно, зато единообразно.

хехе. а кто меня извращенцем обзывал ? ;)

new позволяет себе при нехватке памяти генерировать bad_alloc

более того, еще возможны исключения в конструкторах создаваемых объектов
впрочем для POD и простых классов этого можно легко избежать
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34396841
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обоим:

1) чей-то я не особо понял ,чего такого мне пытались показать
2) new рулит.
3) исключения - штука хорошая с закрытых помещениях, т.е. не ломающая логику программы
3.1) даже с исключениями есть SAFE_DELETE который вполне сносно используется при исключениях.
3.1.1) а еще есть манагеры собственные....
3.1.....1) короче не просто не убедили, но и укрепили.

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397106
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin
1) чей-то я не особо понял ,чего такого мне пытались показать

Пытались показать что использование RAII значительно упрощает жизнь
Aklin
2) new рулит.

Совсем не по-детски и в неожиданном для вас направлении. Ну не желаете вы пользоваться исключениями, а он это делает, даже в тех случаях когда вы уверены что это не такю Удинственный способ его "исправить" ключик у компилятора включить:)
Aklin
3) исключения - штука хорошая с закрытых помещениях, т.е. не ломающая логику программы

Вы не любите кошек? Да вы просто не умеете их готовить!:)
Мы по этому поводу отношения выяснили здесь
Aklin
3.1) даже с исключениями есть SAFE_DELETE который вполне сносно используется при исключениях.
3.1.1) а еще есть манагеры собственные....

Ты бы показал нам темным как надо. Просвяти, покажи! А то вот живем и не знаем как надо. Ну а мы потрепем, может родим такое что вуликие гуру будут опыт перенимать.
Aklin
3.1.....1) короче не просто не убедили, но и укрепили.

Укрепеился в вере? Земля плоская и на 3 слонах? Ну ладно, я не настаиваю.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397580
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded
Пытались показать что использование RAII значительно упрощает жизнь
не убедили.

blinded
Совсем не по-детски и в неожиданном для вас направлении. Ну не желаете вы пользоваться исключениями, а он это делает, даже в тех случаях когда вы уверены что это не такю Удинственный способ его "исправить" ключик у компилятора включить:)
я говорил, что использование исключений только в закрытых пространствах.

blinded
Вы не любите кошек? Да вы просто не умеете их готовить!:)
Мы по этому поводу отношения выяснили здесь
читал, читал и отвечал. результатом стало то, что исключения кривые и работа с ними плоха. кроме этого есть статик, глобал и много прочих полезных штук.
я за исключения только в исключтельных случаях(с) и в закрытых простанствах.

blinded
Ты бы показал нам темным как надо. Просвяти, покажи! А то вот живем и не знаем как надо. Ну а мы потрепем, может родим такое что вуликие гуру будут опыт перенимать.
Код: plaintext
1.
2.
3.
Class1* cl1 = new Class1;
SAFE_DELETE(cl1);SAFE_DELETE(cl1);
SAFE_DELETE(cl1);
и ни одной ошибки.

blinded
Укрепеился в вере? Земля плоская и на 3 слонах? Ну ладно, я не настаиваю.
в том что исключения кривые а дополнительные настрйки неповоротливы.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397584
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а ну да, есть еще одноа прикольная конструкция приглушающая ваши доводы.

Код: plaintext
1.
2.
3.
do
{
...
}while( 0 )

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397625
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin blinded
Пытались показать что использование RAII значительно упрощает жизнь
не убедили.

Значит плохие убеждальщики. Но мы будем продолжать
Aklin blinded
Совсем не по-детски и в неожиданном для вас направлении. Ну не желаете вы пользоваться исключениями, а он это делает, даже в тех случаях когда вы уверены что это не такю Удинственный способ его "исправить" ключик у компилятора включить:)
я говорил, что использование исключений только в закрытых пространствах.

А как быть с new? Но об этом ниже.
Aklin
blinded
Вы не любите кошек? Да вы просто не умеете их готовить!:)
Мы по этому поводу отношения выяснили здесь
читал, читал и отвечал. результатом стало то, что исключения кривые и работа с ними плоха. кроме этого есть статик, глобал и много прочих полезных штук.
я за исключения только в исключтельных случаях(с) и в закрытых простанствах.

Ну это вы сделали такой вывод
Aklin blinded
Ты бы показал нам темным как надо. Просвяти, покажи! А то вот живем и не знаем как надо. Ну а мы потрепем, может родим такое что вуликие гуру будут опыт перенимать.
Код: plaintext
1.
2.
3.
Class1* cl1 = new Class1;
SAFE_DELETE(cl1);SAFE_DELETE(cl1);
SAFE_DELETE(cl1);
и ни одной ошибки.

Уж не так ли он выглядит
Код: plaintext
1.
2.
3.
4.
5.
6.
# define SAFE_DELETE(ptr)\
if (ptr)\
{\
  delete ptr;\
  ptr =  0 ;\
}\
Ну что же не все вам меня критиковать. Только давайте условимся, - кривизна рук не аргумент.
1) Начнем с просто
Код: plaintext
1.
2.
3.
  SomeType* c = new SomeType[](...);
  ...
  SAFE_DELETE(c); // ups, не удалим мы правильно массив, тоже что и auto_ptr
2) Ну и чем он поможет в такой ситуации
Код: plaintext
1.
2.
3.
4.
5.
6.
  SomeType* c0 = new SomeType(...);
  SomeType* c1 = new SomeType(...); // если здесь будет исключение bad_alloc 
                                                     // (вы в своем коде исключений не используете)
  ...                                                // то память потечет
  SAFE_DELETE(c0);
  SAFE_DELETE(c1);
ну давайте поправим
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  SomeType* c0 = new SomeType(...);
  try
  {
    SomeType* c1 = new SomeType(...);
  }
  catch(...)
  {
    SAFE_DELETE(c0);
    throw;
  }
  ...
  SAFE_DELETE(c0);
  SAFE_DELETE(c1);
Во уродство, а представьте что надо создать много объектов, ну хотябы 10
3) А вот теперь предствавим что руки у меня кривые и сунул я в SAFE_DELETE что-то совсеи не то
Код: plaintext
1.
2.
3.
4.
5.
  SomeType c0 = new SomeType(...);
  int c1;

  ...
  SAFE_DELETE(c1); // ups а ведь компилер ничего не скажет
4) Задачка посложней - важен порядок в котором объекты разрушаются. Тут конечно auto_ptr не помощник, а вот shared_ptr очень даже и очень
Код: plaintext
1.
2.
3.
4.
5.
  SomeType* c0 = new SomeType(...);
  SomeType* c1 = new SomeType(...);
  ...
  SAFE_DELETE(c1); // ups не тот порядок возможны ошибки
  SAFE_DELETE(c0);
5) Ну строчку SAFE_DELETE не забыть написать надо

А теперь объясни мне зачем весь это геморрой, если есть легкие классы оберток, которые все это закрывают?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397725
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedДолжен разочаровать, в вашем понимании new ненормален. Он позволяет себе при нехватке памяти генерировать bad_alloc. Так что присоединяйтесь
Обьясните, пожлауйста, каким образом auto_ptr может помочь при нехватке памяти.

blindedА теперь объясни мне зачем весь это геморрой, если есть легкие классы оберток, которые все это закрывают?
Вот в таких случаях и полезен finally.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397744
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Обьясните, пожлауйста, каким образом auto_ptr может помочь при нехватке памяти.

При любом исключении, а не только при нехватке памяти гарантируется, что при раскрутке стека для всех автоматических объектов будут вызваны деструкторы. Следовательно, на каком бы вызове new не вылетел bad_alloc, гарантируется, что динамические ресурсы (не только память, но хендлы окон, хэндлы открытых файлов, хэндлы мьютексов) находившиеся под управление автоматических объетов (я не имею ввиду только std::auto_ptr, а любые другие scope guard), будут корректно возвращены системе. Если для вас и это не является весомым аргументов, то, извините, здесь вас "исправит только могила" или своиже "грабли" :). А ваша уверенность в том, что вы можете изолировать все исключения на самом нижнем уровне системы говорит лишь о том, что вы используете уже сложившийся стиль и что-либо менять для вас является не подъемной задачей - это я могу принять, но нельзя же этот подход насаждать как догму.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397745
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, я ErV принял за Aklin. Я обращался к Aklin-у.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397777
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир- если вас интересует случай new[], то тут используются std::vector, boost::shared_array (или еще чего), но не auto_ptrА что действительно нельзя? Вот я проверил:
Код: plaintext
1.
2.
for(int i =  0 ; i <  1000000 ; i++)
   //int *a = new int[1000000];
   std::auto_ptr<int> a(new int[ 10000 ]);
Утечки памяти вроде нет. Т. е. если я правильно понял, то вопрос в том, можно ли делать так:
Код: plaintext
1.
int *a = new int[ 1000000 ];
delete a; // вместо delete[] a;
Поясните пожалст в двух словах, в чём разница между delete и delete[]? И если в моём примере неправильное использование auto_ptr, то почему нет утечки памяти?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397782
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV blindedДолжен разочаровать, в вашем понимании new ненормален. Он позволяет себе при нехватке памяти генерировать bad_alloc. Так что присоединяйтесь
Обьясните, пожлауйста, каким образом auto_ptr может помочь при нехватке памяти.

blindedА теперь объясни мне зачем весь это геморрой, если есть легкие классы оберток, которые все это закрывают?
Вот в таких случаях и полезен finally.
auto_ptr не поможет при нехватке, зато он освободит память и никакой finally не требуется
еще раз
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
void top()
{
  try
  {
    midle();
  }
  catch (bad_alloc e)
  {
     cerr << "памяти нема" << endl;
  }
}

void midle()
{
  auto_ptr<SomeClass> someClass = new SomeClass();
  bottom(someClass);
}

void bottom(SomeClass* sclass)
{
  auto_ptr<AnotherClass> aclass = new AnotherClass();
  auto_ptr<AnotherClass> bclass = new AnotherClass();
  ...
  sclass->doSomthing(aclass, bclass);
  
}
Во как и никакого finally и совственных макросов, алгоритмы прозрачны и все освобождается
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397785
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К Голенков Владимир- если вас интересует случай new[], то тут используются std::vector, boost::shared_array (или еще чего), но не auto_ptrА что действительно нельзя? Вот я проверил:
Код: plaintext
1.
2.
for(int i =  0 ; i <  1000000 ; i++)
   //int *a = new int[1000000];
   std::auto_ptr<int> a(new int[ 10000 ]);
Утечки памяти вроде нет. Т. е. если я правильно понял, то вопрос в том, можно ли делать так:
Код: plaintext
1.
int *a = new int[ 1000000 ];
delete a; // вместо delete[] a;
Поясните пожалст в двух словах, в чём разница между delete и delete[]? И если в моём примере неправильное использование auto_ptr, то почему нет утечки памяти?
А деструкторы все вызываются? То-то же
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397792
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандарт явно говорит о том, что память выделенная с помощью new, new[] должна быть удалена с помощью delete, delete[] соответственно. То что на вашей платформе память, выделенная с помощью new[], может быть удалена с помощью delete, ни о чем не говорит - то есть, вам просто повезло.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397795
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА деструкторы все вызываются? То-то жеТ. е. в случае с
Код: plaintext
std::auto_ptr<MyClass> a(new MyClass[ 10 ]);
не будут вызваны все деструкторы? А в случае когда деструкторов нет, например:
Код: plaintext
std::auto_ptr<int> a(new int[ 10 ]);
такое применение auto_ptr возможно?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397796
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковСтандарт явно говорит о том, что память выделенная с помощью new, new[] должна быть удалена с помощью delete, delete[] соответственно. То что на вашей платформе память, выделенная с помощью new[], может быть удалена с помощью delete, ни о чем не говорит - то есть, вам просто повезло. Понял, отстал... :-)
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397859
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
буду отвечать по некоторым поуктом, поскольку остальные либо копируются либо я уже отвечал.

Код: plaintext
1.
2.
  SomeType* c = new SomeType[](...);
  ...
  SAFE_DELETE(c); // ups, не удалим мы правильно массив, тоже что и auto_ptr
это называется плохой стиль программирования. ЛИБО вы создаете ЛИБО ПРИСВАИВАЕТЕ.
как уже говорил, для этотго есть менеджеры. :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  SomeType* c0 = new SomeType(...);
  try
  {
    SomeType* c1 = new SomeType(...);
  }
  catch(...)
  {
    SAFE_DELETE(c0);
    throw;
  }
  ...
  SAFE_DELETE(c0);
  SAFE_DELETE(c1);

никто вам не запрещает переписать SAFE_DELETE :)

Код: plaintext
1.
2.
3.
4.
  SomeType c0 = new SomeType(...);
  int c1;

  ...
  SAFE_DELETE(c1); // ups а ведь компилер ничего не скажет
а вы программировать-то умеете? а то я вижу только плохой стиль и полное отсутствие понимания.

Код: plaintext
1.
2.
3.
4.
  SomeType* c0 = new SomeType(...);
  SomeType* c1 = new SomeType(...);
  ...
  SAFE_DELETE(c1); // ups не тот порядок возможны ошибки
  SAFE_DELETE(c0);
то же. если вам НАДО удалять их в определенной последовательности, вы это сделаете. (и без auto_ptr). иначе вы же и виноваты.

авторА теперь объясни мне зачем весь это геморрой, если есть легкие классы оберток, которые все это закрывают?
1) у вас в руках мощнейшее средство разработки. а вы не знаете, что с ним делать.
2) вы сами же обрезаете много полезных возможностей этим.
3) если закрыть все преимущества си, получется vb.
4) определитесь: оберток (т.е. интерфейсов) или закрывают (т.е. затычек) ???

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397864
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковПри любом исключении, а не только при нехватке памяти гарантируется, что при раскрутке стека для всех автоматических объектов будут вызваны деструкторы. Следовательно, на каком бы вызове new не вылетел bad_alloc, гарантируется, что динамические ресурсы (не только память, но хендлы окон, хэндлы открытых файлов, хэндлы мьютексов) находившиеся под управление автоматических объетов (я не имею ввиду только std::auto_ptr, а любые другие scope guard), будут корректно возвращены системе. Если для вас и это не является весомым аргументов, то, извините, здесь вас "исправит только могила" или своиже "грабли" :). А ваша уверенность в том, что вы можете изолировать все исключения на самом нижнем уровне системы говорит лишь о том, что вы используете уже сложившийся стиль и что-либо менять для вас является не подъемной задачей - это я могу принять, но нельзя же этот подход насаждать как догму.

1) возвращение системе явно громозкое занатие. а если мне не надо их возвращять?
программа начинает разваливаться при первом же исключении "нехватка памяти" судя по вашим словам.
2) я не вижу аргумента. точнее вижу что а) громозкость б) вы ставите затычки на язык в) перестаете контролироовать программу.
3) у меня нет такого убеждения, хотя говорилось, что это отлючается. у меня принцип "использовать исключения только в исклюительных случаях".
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397878
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin

Вы так ничего не ответили на счет исключений - как будет выглядеть ваш код, который должен быть безопастным по отношению к исключениям с SAFE_DELETE - вы что же предлагаете в каждой функции оперирующей new использовать try/catch/finally. А зачем эти сложности, если все достается почти даром, если поместить голый указатель под управление автоматического объекта - здесь фактически нет оверхеда, поскольку тотже auto_ptr легковесен и легко встаивается. Сравните:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
void foo()
{
   throw  1 ;
}

void boo1() 
{
    std::auto_ptr<int> p1(new int( 10 ));
    std::auto_ptr<int> p2(new int( 10 ));
    foo();
}

void boo2() 
{
    int *p1 =  0 ;
    int *p2 =  0 ;
    try {

        p1 = new int( 10 );
        p2 = new int( 10 );
        foo();
    }
    catch(...) 
    {
           delete p1;
           delete p2;
           throw;
    }
}

И вы утвержаете, что boo2() это вершина ради которой надо было создавать С++? Я очень глубоко в этом сомневаюсь. Код boo1 выразительней, он лишен шелухи, которую приходится писать придерживаясь вашего подхода в любой функции оперирующей динамическими ресурсами только ради того, чтобы сделать код безопасным по отношению к исключениям. Нечитаемость - это слишком большая цена в промышленном программировании.

Вы утверждаете
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397879
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded
auto_ptr не поможет при нехватке, зато он освободит память и никакой finally не требуется
еще раз
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
void top()
{
  try
  {
    midle();
  }
  catch (bad_alloc e)
  {
     cerr << "памяти нема" << endl;
  }
}

void midle()
{
  auto_ptr<SomeClass> someClass = new SomeClass();
  bottom(someClass);
}

void bottom(SomeClass* sclass)
{
  auto_ptr<AnotherClass> aclass = new AnotherClass();
  auto_ptr<AnotherClass> bclass = new AnotherClass();
  ...
  sclass->doSomthing(aclass, bclass);
  
}
Во как и никакого finally и совственных макросов, алгоритмы прозрачны и все освобождается

А зачем здесь ВООБЩЕ нужно было динамическое выделение памяти?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
void top(){
   middle();
}

void middle(){
  SomeClass someClass();   
  bottom(someClass);
}

void bottom(SomeClass& sclass){
  AnotherClass aclass();
  AnotherClass bclass();
  ...
  sclass.doSomthing(aclass, bclass);
}

Aklin
Код: plaintext
1.
2.
3.
Class1* cl1 = new Class1;
SAFE_DELETE(cl1);SAFE_DELETE(cl1);
SAFE_DELETE(cl1);

Можно вопрос? А зачем вам вообще SAFE_DELETE?
Если инициализировать переменную изначально нулем, то никакой SAFE_DELETE, так как в качестве аргемента в delete/delete[] можно передавать нулевой указатель и удалять его сколько угодно... Если у вас был std::bad_alloc во время new, то, значит, в переменной у вас 0xcccccccc - если это отладочный билд и это MSVC, или неизвестно что, если это что-то другое. Соответственно, SAFE_DELETE вам не поможет.
Если же в переменной был нуль, то SAFE_DELETE будет пустой тратой времени, так как нулевой указатель можно удалять:
MSVC_help
Using delete on a pointer to an object not allocated with new gives unpredictable results. You can, however, use delete on a pointer with the value 0. This provision means that, when new returns 0 on failure, deleting the result of a failed new operation is harmless. See The new and delete Operators for more information.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397893
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Aklin

Бог вам судья. Аминь :)
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397901
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если короче, резюмирую то, что мне пытались объяснить про auto_ptr
1) это либо затычка либо интерфейс (сами они еще не поняли)
2) это громозко (в плане конечного кода) и плохо контролируется
3) это БАЛЬШОЙ универсальный менеджер (+неконтролируемый)
4) накладываются ограничения.

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397906
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Касательно auot_ptr - какой в нем смысл, если он даже подсчетом ссылок на указатель не занимается?
Возникла мысль, что в случаях, когда требуется авто-униктожение обьектов, часто можно просто обойтись без динамического выделения памяти.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397907
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков2 Aklin

Бог вам судья. Аминь :)

я вот что: даже заосмневался а может я неправ. и проверил:
накаих исключений. ПРЕКРАСНО работающий new и SAFE_DELETE.
прекрасно вызывающиеся деструкторы... и все в этом духе.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
#include <iostream.h>

int con =  0 , des =  0 ;

#define SAFE_DELETE(A)\
	if(A)\
{\
	delete A;\
	(A) =  0 ;\
}

class AAA
{
public:
	char* a;
	AAA()
	{
		a = new char[128l*1024l*1024l];
		con++;
		if (!a) cout << "nomem.\n";
	}
	~AAA()
	{
		if (a)SAFE_DELETE(a);
		des++;
	}
};

void main()
{
	int b =  40 ;
	AAA* a[ 100 ];
	int i;

	for (i= 0 ; i<b; i++)
	{
		a[i] = new AAA;
		cerr << "+";
	}
	cerr << "\n[" << con << "]\n";

	for (i= 0 ; i<b; i++)
	{
		delete a[i];
		cerr << "-";
	}
	cerr << "\n[" << des << "]\n";
}
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397911
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Можно вопрос? А зачем вам вообще SAFE_DELETE?


new так же как и элементарный calloc (malloc) возвращяют 0 при отсутствии памяти.
если вы НЕ использовали указатель (даже не занулили), то это ошибка ВАШЕГО кода, которая и приводит к утечкам.
...
Рейтинг: 0 / 0
25 сообщений из 74, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / auto_ptr или new + delete
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]