powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / auto_ptr или new + delete
74 сообщений из 74, показаны все 3 страниц
auto_ptr или new + delete
    #34390032
Фотография sashka304
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, просветите что лучше использовать auto_ptr или new + delete.
или в принципе разницы никакой нет, просто при использовании auto_ptr ненужно заботится о том чтоб не забыть сделать delete обьекту
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390111
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
auto_ptr'ом надо уметь пользоваться, иначе потом будет много отрицательных эмоций. Лучше взять что-нибудь из boost. Хотя ежели разницы нет то проект небольшой.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390208
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главное - это уяснить, что голые new + detele поценциально опасны. А далее уже надо выбирать среди std::auto_ptr, boost::share_ptr и т.п. по тому, какая стратегия владения вам необходима. std::auto_ptr при копировании всегда передает право владения копии, boost::shared_ptr хранит указатель до тех пор, пока существует хотя бы одна ссылка на него.

Вы можете показать как вы будете использовать эти объекты?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390223
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков пишет:

> Главное - это уяснить, что голые new + detele поценциально опасны. А

.... при наличии исключений .
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390240
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже если бы в С++ не было исключений, никто не исключает возможность банально забыть освободить память (memory leak), присвоить указателю новое значение (memory leak).
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390247
.... при наличии исключений .

... return тоже неплохо
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390253
... как и любой выход из влока, break к примеру в цикле
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390506
суммарно:

- любой из smart_ptr представляет реализацию более общей идиомы RAII для управления ресурсом памяти (очень важно при работе с исключениями, и не только)

- реализация std::auto_ptr призвана обеспечить минимальный (м.б. нулевым) overhead по сравнению с обычными указателями, но платой за это является отсутствие полноценной семантики копирования (очень важно для работы с контейнерами, так же передача параметров по значению)

отсюда область применения -- локальные блоки, иначе альтернатива boost::shared_ptr (или еще чего)

- если вас интересует случай new[], то тут используются std::vector, boost::shared_array (или еще чего), но не auto_ptr

/* поправьте если чего не так */
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390740
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир пишет:

Рибяты йа нидумал о таких прастых вищах.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390772
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковДаже если бы в С++ не было исключений, никто не исключает возможность банально забыть освободить память (memory leak), присвоить указателю новое значение (memory leak).

это лечится новыми руками от ушей.

опять же зависит от кривизны рук.
если сразу ничего не удаляете, то никогда ничто вам не поможет.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34390886
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да-да, вы с детства программируете без утечек памяти и пользовались всю жизнь только голыми указателями ;) Skope guard-ы решают перечисленные здесь проблемы и позволяют получить ясность в вопросах связанные с временем жизни динамических объектов. Вы, я так понял, ратуете за выпремление рук - как вы собираетесь достич этой цели?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34391282
Рибяты йа нидумал о таких прастых вищах.

панемайу! но для аффтора топега возможна фсе не так проста..
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34391290
Да-да, вы с детства программируете без утечек памяти и пользовались всю жизнь только голыми указателями ;)

да, было время в детстве на plain C лабали ;)
а некоторые на нем и до сих пор рисуют
и ничего
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34391298
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков... и пользовались всю жизнь только голыми указателями ;)
только её половину..., потом на ссылки перешел.. ;)

sashka304
Ребята, просветите что лучше использовать auto_ptr или new + delete.

Для какой задачи?

Если в классе один раз выделяется блок памяти, висит там без изменений, и убивается в деструкторе, зачем там auto_ptr?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34391342
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV Анатолий Широков... и пользовались всю жизнь только голыми указателями ;)
только её половину..., потом на ссылки перешел.. ;)

sashka304
Ребята, просветите что лучше использовать auto_ptr или new + delete.

Для какой задачи?

Если в классе один раз выделяется блок памяти, висит там без изменений, и убивается в деструкторе, зачем там auto_ptr?
А потом их становится два, и ежели 2-ой не выделился нужно вернуть первый. И так без конца один и тотже спор. Что лучше быть богатым тормозом или бедным шустряком.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34391397
Фотография sashka304
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучще быть богатым тормозом :))
вообщем у меня пока выделение памяти под объект происходит в одном классе, раньше часть кода была написана с new и delete, а мне вот надо немного дописать и переписать, вот я думаю использовать auto_ptr или делать как там и было... обьектиков в разных ф-ях создается от 1 до 10.

Почитав посты думаю всетаки сделаю я auto_ptr :)

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

я за нормальный код.
на самом деле руки тут и ни при чем. и я знаю (работаю) с проектом в 100к строк. и там сделано все нормально. любая динамика повешена на SOFT_FREE или SOFT_DELETE. это - простые дефайны, облегчившие и решившие большинство задач.

для прочей прстоты используются СОБСТВЕННЫЕ манагеры, т.к. они и быстрее и понятней.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34391861
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded
А потом их становится два, и ежели 2-ой не выделился нужно вернуть первый. И так без конца один и тотже спор. Что лучше быть богатым тормозом или бедным шустряком.
Если я точно знаю, где и как обьект будет использоваться, то можно и без auto_ptr обойтись. Тем более, как я понял, для конструкции типа SomeClass** (динамически выделяется массив указателей, для указателей создяются обьекты, потом указатели сортируются) это не вариант.

Спорить не буду - не вижу смысла. (так как выльется в очередной холивар типа "исключения - за и против" и "кто-нибудь обьяснит мне чем Дельфи лучше C++")
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34392662
ErV : Если в классе один раз выделяется блок памяти, висит там без изменений, и убивается в деструкторе, зачем там auto_ptr?

однакож, если в конструкторе выделяется память а потом происходит неперехваченное исключение, то до деструктора дело просто не доходит == memory leak

об этом тоже стоит помнить
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34393116
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир ErV : Если в классе один раз выделяется блок памяти, висит там без изменений, и убивается в деструкторе, зачем там auto_ptr?

однакож, если в конструкторе выделяется память а потом происходит неперехваченное исключение, то до деструктора дело просто не доходит == memory leak

об этом тоже стоит помнить
Насколько я помню, если класс (в котором выделяется блок памяти) используется в программе как
SomeClass someclass; //а не SomeClass* someclass;
произойдет раскрутка стека, и будет вызван деструктор.
При исключении в конструкторе, если оно не было обработано, работа программы завершается, а системные ресурсы, используемые процессом, под Win, если я не ошибаюсь, освобождаются по факту его завершения. Можете проверить:
Код: plaintext
1.
2.
3.
4.
void main(void){
	int* c = new int[ 50000000 ];
	getch();
}
Память не высвобождается, но система в нокаут не уходит. WinXP, по крайней мере...
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34393279
Память не высвобождается, но система в нокаут не уходит. WinXP, по крайней мере...

исчо раз: при неперехваченном исключении в конструкторе, объект не считается созданным и его деструктор не вызывается

если дело происходит внутри сервиса (дЭмона), то скорей всего исключение перехватывается на более высоком уровне и пишется в лог, работа продолжается, утечка накапливается

и через некоторое время сервер "станет раком"

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

исчо раз: при неперехваченном исключении в конструкторе, объект не считается созданным и его деструктор не вызывается

если дело происходит внутри сервиса (дЭмона), то скорей всего исключение перехватывается на более высоком уровне и пишется в лог, работа продолжается, утечка накапливается

и через некоторое время сервер "станет раком"

"и это очень плохо"

1) и что, прям auto_ptr это решает? не верю.
2) в том числе и поэтому я за нормальный код (т.е. без корявых исключений).

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


1) все равно не верю
1.1) если и решает, то коряво
1.1.1) а ты не думал, зачем программисту дали такую свободу? чтобы он сам все нормально делал.

2) new - не есть нормальный код ? самый что ни есть нормальный
а вот исключения как уже говорилось - плохо.

[quote]
C++[/quote]
не совсем согласен, ибо не я работю на си, а он на меня.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34396511

1) все равно не верю
1.1) если и решает, то коряво


вариант 1:
Код: 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.
class A
{
private:

	B* _pb;
	C* _pc;
	
public:

	A()
	{
		//исключение возможно:
		auto_ptr<B> pb( new B() );
		auto_ptr<C> pc( new C() );
		
		//исключение не возможно:
		_pb = pb.release();
		_pc = pc.release();
	}

	~A()
	{
		delete _pb;
		delete _pc;
	}
};

вариант 2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class A
{
private:

	auto_ptr<B> _pb;
	auto_ptr<C> _pc;
	
public:

	A(): _pb( new B() ), _pc( new C() )
	{
	}
};

впрочем есть еще альтернатива try/catch

2) new - не есть нормальный код ? самый что ни есть нормальный
а вот исключения как уже говорилось - плохо.


тут дело в том, что исключения это часть современного C++
- поэтому, либо вы контролируете весь свой код, включая библиотеки
- либо plain old C
- либо миритесь с тем, что new A() может высвать исключение

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

аффтопитезь: объект либо именован, либо не существует
Вообще, в некоторых случаях я писал свой класс, который был более легковесным аналогом вектора. Темплейт, создающий динамический массив из элементов.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
template<typename Item, typename Counter = unsigned long> struct Table{
	Item* items;
	Counter size;
	table(Counter _size): size(_size){
		items = new Item[_size];
	}
	table(Counter _size, Item* src): size(_size){
		items = new Item[_size];
		for (Counter i =  0 ; i < size; i++){
			items[i] = src[i];
		}
	}
	//мне это не сильно нужно, но для удобства...
	Item& operator[](Counter index){
		return items[index];
	}
	/*Item* operator[](Counter index){
		return &items[index];
	}   */
	~table(void){
		delete[]  items;
	}
};
Эту штуку я писал только по тому, что временных массивов у меня была куча и мне было лень их все отслеживать, расписывая для каждого delete[]. Но создавать обертку для одной переменной - извините, не совсем понимаю...
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397917
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV

это можно назвать короче, "manager" (memory mgr). я уже про это говорил.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397918
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin ErV
Можно вопрос? А зачем вам вообще SAFE_DELETE?


new так же как и элементарный calloc (malloc) возвращяют 0 при отсутствии памяти.
если вы НЕ использовали указатель (даже не занулили), то это ошибка ВАШЕГО кода, которая и приводит к утечкам.
Я имел в виду следующее - если вам возвращается 0, зачем вам SAFE_DELETE? Что он делает? Нулевые указатели можно удалять, и это не дает ошибок.
Код: plaintext
1.
2.
3.
4.
void main(void){
	int *p =  0 ;
	delete[] p;
}
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397925
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV Aklin ErV
Можно вопрос? А зачем вам вообще SAFE_DELETE?


new так же как и элементарный calloc (malloc) возвращяют 0 при отсутствии памяти.
если вы НЕ использовали указатель (даже не занулили), то это ошибка ВАШЕГО кода, которая и приводит к утечкам.
Я имел в виду следующее - если вам возвращается 0, зачем вам SAFE_DELETE? Что он делает? Нулевые указатели можно удалять, и это не дает ошибок.
Код: plaintext
1.
2.
3.
4.
void main(void){
	int *p =  0 ;
	delete[] p;
}


точно не помню, можно ли удалять нулевые указатели, но обнуление точно помогает.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34397933
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklinточно не помню, можно ли удалять нулевые указатели, но обнуление точно помогает.
И ещё раз цитирую:
C++_reference
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
    #34397941
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создавать функции типа SAFE_DELETE только если обьект освобождается как-то по-другому, например, если это COM объект, для освобождения которого надо вызвать release, а вызов Release() с нулевого указателя даст, ясен пень, AccessViolation.
Кстати, есть более (ИМХО) удобный вариант, чем макросы.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
template <class C>void safeRelease(C*& p){
	if (p){
		p->Release();
		p =  0 ;
	}
}

template <typename T> void safeDelete(T*& p){
	delete p;
	p =  0 ;
}

template <typename T> void safeDeleteArray(T*& p){
	delete[] p;
	p =  0 ;
}
Просто в случае с макросом есть 100% гарантия того, что он каждый раз будет целиком вставлен в код, а в случае с темплейтами есть вероятность того, что для каждого типа аргумента будет сгенерирована отдельная функция, т.е. код станет меньше.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34398764
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не Анатолий, ручки не сложу Сначала про new
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
# include <iostream>
# include <iomanip>
int main()
{
  int sz = int( 2 . *  1024  *  1024  *  1024  - 1 );
  unsigned char* buf = new unsigned char[sz];
  buf = new unsigned char[sz];                                // повторить нужное число раз для получения нужного эффекта
  if (buf)
    std::cout << "Allocated" << std::endl;
  else
    std::cout << "not allocated" << std::endl;
}
а это вывод от задачи скомпилированной gcc (3.4.5)
Код: plaintext
1.
2.
3.
terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc
Aborted
Это камешек в огород Visual C ну не стандартный он. Так что на Unix вас ждет масса сюрпризов:-))) Специально залез в Язык программирования C++ Бьерн Страусструп Специальное издание п 6.2.6.2
Что касается кода который я привожу? не надо воспринимать его буквально от а-я. Это всего лишь попытка смоделировать ситуацию, не более того. ( см ). Я просто пытался показать что происходит если генерацию исключения и его обработку разделяют несколько уровней вложенности в которых также динамически создаются объекты.
Теперь на счет auto_ptr. Люблю я людей рассуждающих о вкусе устриц не разу их не попробовав. Хоть бы из любопытсва взяли и посмотрели что это. Ну ладно коротенько перескажем это маленький шаблон - обертка(proxy) вся задача которого отслеживать время жизни указателя. У него масса недостатков. и одно гигантское достоинство - он стандартный.
А что касается кривизны кривизны моих рук и не знания что делать выданным мне инструментом. Ну это по крайней мере безосновательно
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34398835
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded

для gcc есть рабочий free и calloc(malloc).
что касается того что я не пробовал auto_ptr вы глубоко залуждаетесь, провел два часа в этой беседе и пока не понял никаких плюсов, зато написал (см. выше) "запутанный код" и "неконтролируемость".
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34398872
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin blinded

для gcc есть рабочий free и calloc(malloc).
что касается того что я не пробовал auto_ptr вы глубоко залуждаетесь, провел два часа в этой беседе и пока не понял никаких плюсов, зато написал (см. выше) "запутанный код" и "неконтролируемость".
Ну мы же не на С свами пишем. Да и отделение выделения памяти от вызова конструктора ни к чему хорошему не приведет,
Ну что до запутанности кода и неконтролируемости - это вы не научились им подьзоваться. Кстати должен вас огорчить, в грядущий стандартбудет включено несколько новых smart указателей.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34398937
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedТеперь на счет auto_ptr. Люблю я людей рассуждающих о вкусе устриц не разу их не попробовав. Хоть бы из любопытсва взяли и посмотрели что это.
Посмотрел. Не понравилось - криво и неудобно, замедляет код при частом обращении к указателю.

blinded
У него масса недостатков. и одно гигантское достоинство - он стандартный.

Ну и что, что стандартный? Вы когда (если) под Win пишете, вы GlobalAlloc, например используете? Он тоже (для Win) стандартный...
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34399374
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded

другими словами ничего нового сказть никто больше может.
кроме того мне никто не запрещает сделать макрос по конструкции try{new...}...{...} например SAFE_NEW.

это дудет переносимо и не станет обращаться к внешним библиотекам.

кстати, new не только стандартный, он еще и есть основа языка си, а auto_ptr - лишь оболочка (затычка) которую поставляют ко всем компиляторам.
это то же, если бы к кажжлму компилятору я бы прибавлял еще "hello world" функцию или вроде того.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34399654
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С тех пор как я начал пользоваться умными у меня стало значительно меньше ошибок связанных с неправильной работой с памятью. Вообще помоему это очень полезная вещь.
ErV
Посмотрел. Не понравилось - криво и неудобно, замедляет код при частом обращении к указателю.

Я когда-то смотрел, на gcc (версию уже не помню). При отключенной оптимизации есть замедление, а при включенной никакого замедления нет, std::auto_ptr и boost_scoped_ptr работают так же как обычный указатель. boost::shared_ptr работает медленнее.

Aklin
другими словами ничего нового сказть никто больше может.
кроме того мне никто не запрещает сделать макрос по конструкции try{new...}...{...} например SAFE_NEW.

это дудет переносимо и не станет обращаться к внешним библиотекам.

И чем это лучше auto_ptr-а? Он тоже стандартен, переносим и не требует внешних библиотек. Кому нужны эти макросы?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34399665
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KИ чем это лучше auto_ptr-а? Он тоже стандартен, переносим и не требует внешних библиотек. Кому нужны эти макросы?

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


Если я пишу на C++ то я подключаю стандартную бублиотеку С++ независимо от того использую я auto_ptr или не использую. auto_ptr это небольшой шаблон, в который оборачивается указатель, никаких библиотек он не использует.

Aklin
макросы? gcc ругается, если нет памяти, и это обходиться макросами.
простое и понятное рещение. не запутывающее код. причем контроль остается на том же уровне.
свобода не изменяентся также.

Мне не кажется что это проще и понятнее чем std::auto_ptr или boost::scoped_ptr.
То что контроль не остается на том же уровне это как-раз и помогает избежать многих ошибок с указателями.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34399736
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_K
подыдожу, что бы все поняли, о чем идет речь
1) те, кто используют auto_ptr не знают что это : интерфейсм или затычка
2) кто-то сказал, что это манагер. я уже говорил, что собственные манагеры быстрее, понятней и удобней
3) контроль над программой падает.

также мне интересен вопрос о переносу указателей через третьи руки.
скажем
a=new
b=a
c=b
причем c из другой функции.
что на это ответит auto_ptr ?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34399891
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin
подыдожу, что бы все поняли, о чем идет речь
1) те, кто используют auto_ptr не знают что это : интерфейсм или затычка
2) кто-то сказал, что это манагер. я уже говорил, что собственные манагеры быстрее, понятней и удобней
3) контроль над программой падает.


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

Aklin
также мне интересен вопрос о переносу указателей через третьи руки.
скажем
a=new
b=a
c=b
причем c из другой функции.
что на это ответит auto_ptr ?


Отличный пример! 3 указателя на одну область памяти, можно легко запитаться и освободить память 2 раза или использовать указатель на уже освобожденную память, или просто забыть освободить память, или еще что-нибудь.
Объясните конкретнее, что именно вы хотите сделать, тогда можно будет решить, какой из умных указателей здесь лучше применить.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34399932
Aklin
1) те, кто используют auto_ptr не знают что это: интерфейсм или затычка

определение интерфейса мне известно
растолкуйте пожалуйста термин "затычка", дабы не было разночтений

2) кто-то сказал, что это манагер. я уже говорил, что собственные манагеры быстрее, понятней и удобней

"манагер" "манагеру" рознь: бывают разные задачи и стратегии их решения
что именно вы имели в виду? а то похоже на "сравнение теплого с мягким"

плюс вам не кажется что "понятней и удобней" это прежде всего дело вкуса и привычек?
а вот "быстрее" нуждается в обосновании

3) контроль над программой падает.

что есть "падения контроля" в контексте применения auto_ptr?
поведение объекта класса внутри области видимости четко детерменированно

также мне интересен вопрос о переносу указателей через третьи руки.

а можно содержательный компилируемый пример?
т.е. проблема + ваш вариант ее решения

йожу понятно, что не зачем пихать auto_ptr во все дыры, только там где полезно
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34399938
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_K1) Можете называть как хотите (интефейс, затычка, менеджер) суть от этого не изменится.
2) Если ваш менеджер понятнее и удобнее для вас, то это не значит что он будет
понятнее и удобне для всех. А будет ли собственный менеджер будет быстрее это еще не известно.
3) Контроль над программой не падает, он наоборот увеличивается.

1) это СОВЕРШЕННО разные понятия
-интерфейс - для удобства программирования, код, который многий исзользуют, но в отдельнм файле + интерфейс
-затычка - закрытие некой дыры (+урезние возможностей)
-менеджер - центрированное управление
2) специальный менеджер для отдельно взятой задачи быстрее и понятней для всех, кто ее пишет. (auto_ptr - швейцарский ножик)
3)когда я поигрался с auto_ptr: я вот не понимаю, в какой момент будут удалены те или иные куски. и не нашел, кто бы мне это указал.

Sandro_KОтличный пример! 3 указателя на одну область памяти, можно легко запитаться и освободить память 2 раза или использовать указатель на уже освобожденную память, или просто забыть освободить память, или еще что-нибудь.
Объясните конкретнее, что именно вы хотите сделать, тогда можно будет решить, какой из умных указателей здесь лучше применить.
вы АСБОЛЮТНО ничего не поняли. если я использую свой меенеджер или не исользую его вообще, то память беру и освобождаю только там, где МНЕ это надо. меня интересовала точка зрения auto_ptr.

также еще интересен вопрос:
Код: plaintext
1.
2.
char* s = new char [ 20000 ];
char* s1=s;
char *s2 = s+ 1000 ;

или
Код: plaintext
1.
2.
3.
char *s = new char [ 2000 ];
strcpy(,,,)
s += strlen(s);
что удалит auto_ptr ???
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34399953
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin
также мне интересен вопрос о переносу указателей через третьи руки.
скажем
a=new
b=a
c=b
причем c из другой функции.
что на это ответит auto_ptr?объект будет доступен через с, а код SAFE_DELETE(a); SAFE_DELETE(b); SAFE_DELETE(c); сломает кучу.
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34399978
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklinвы АСБОЛЮТНО ничего не поняли. если я использую свой меенеджер или не исользую его вообще, то память беру и освобождаю только там, где МНЕ это надо. меня интересовала точка зрения auto_ptr.если на пальцах, то удаляет объект, когда ты его перестаёшь использовать.
Aklin
также еще интересен вопрос:
Код: plaintext
1.
2.
char* s = new char [ 20000 ];
char* s1=s;
char *s2 = s+ 1000 ;

или
Код: plaintext
1.
2.
3.
char *s = new char [ 2000 ];
strcpy(,,,)
s += strlen(s);
что удалит auto_ptr ???std::string?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34400025
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin

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

также мне интересен вопрос о переносу указателей через третьи руки.
скажем
a=new
b=a
c=b
причем c из другой функции.
что на это ответит auto_ptr ?
1) а что вы понимаете под одним и другим. А по научному это называется proxy
2) ну вообще-то под менеджером памяти понимается отличное от того о чем вы сдесь говорили. тот пример ErV это не менеджер памяти - это proxy. Ну то что они понятней - это смотря кому, автору - да, тем кто его использует в темную - нет. И в этом отношении я отдам предпочтение стандартному классу.
3) интересно что подумает ваш приемник, когда увидит ваш доморощенный proxy написанный под конкретный случай?
А насчет указателей там все просто
Код: plaintext
1.
2.
3.
4.
                             
auto_ptr<T> a = new T();      // ОШИБКА!!!
auto_ptr<T> a(new T());       // ok
auto_ptr<T> b = a;               // b.ptr = a.ptr; a.ptr =0;
Неужто так сложно ?
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34400952
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded
Код: plaintext
1.
2.
3.
4.
                             
auto_ptr<T> a = new T();      // ОШИБКА!!!
auto_ptr<T> a(new T());       // ok
auto_ptr<T> b = a;               // b.ptr = a.ptr; a.ptr =0;
Неужто так сложно ?
На мой взгляд очень неудобно, и не стоит использовать по следующей причине:
1) Нарушает стандартное поведение операторов C++. Я думаю, что любого нормального программера повергнет в изумлеение, если в выражении int i = 3; int a = i; printf("i: %d, a: %d",i,a); i к моменту вызовва printf будет равно нулю. Именно это делает auto_ptr;
2) вы выше показали пример, в котором используется auto_ptr. Получается, что auto_ptr нельзя присвоить "не auto_ptr" указатель. Для меня, например, это был бы довольно логичный вариант инициализации. По-моему, это недочет убивает все его достоинства (которых я так особо и не улицезрел) - вместо нормального указателя получается помесь указателя, ссылки и локальной переменной... Память в момент присваивания было бы не так уж сложно высвободить.
3) чтобы решить проблемы с забытыми массивами, может тогда уже сразу заюзать смарт-поинтеры? Нормально реализованные, которые бы поддерживали подсчет ссылок на область, и динамически создавали бы дубликат исходного вариант области при попытке доступа к ней на запись. Вот этот вариант я ещё могу понять.
Кстати, что вам мешает с auto_ptr сделать вот это:
Код: plaintext
1.
2.
3.
auto_ptr<int> i(new int( 123 ));
auto_ptr<int> j = i;
*i =  0 ; //accessViolation, не так ли?
Это уже поинтересней утечки памяти...
...
Рейтинг: 0 / 0
auto_ptr или new + delete
    #34401143
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV blinded
Код: plaintext
1.
2.
3.
4.
                             
auto_ptr<T> a = new T();      // ОШИБКА!!!
auto_ptr<T> a(new T());       // ok
auto_ptr<T> b = a;               // b.ptr = a.ptr; a.ptr =0;
Неужто так сложно ?
На мой взгляд очень неудобно, и не стоит использовать по следующей причине:
1) Нарушает стандартное поведение операторов C++. Я думаю, что любого нормального программера повергнет в изумлеение, если в выражении int i = 3; int a = i; printf("i: %d, a: %d",i,a); i к моменту вызовва printf будет равно нулю. Именно это делает auto_ptr;
2) вы выше показали пример, в котором используется auto_ptr. Получается, что auto_ptr нельзя присвоить "не auto_ptr" указатель. Для меня, например, это был бы довольно логичный вариант инициализации. По-моему, это недочет убивает все его достоинства (которых я так особо и не улицезрел) - вместо нормального указателя получается помесь указателя, ссылки и локальной переменной... Память в момент присваивания было бы не так уж сложно высвободить.
3) чтобы решить проблемы с забытыми массивами, может тогда уже сразу заюзать смарт-поинтеры? Нормально реализованные, которые бы поддерживали подсчет ссылок на область, и динамически создавали бы дубликат исходного вариант области при попытке доступа к ней на запись. Вот этот вариант я ещё могу понять.
Кстати, что вам мешает с auto_ptr сделать вот это:
Код: plaintext
1.
2.
3.
auto_ptr<int> i(new int( 123 ));
auto_ptr<int> j = i;
*i =  0 ; //accessViolation, не так ли?
Это уже поинтересней утечки памяти...
1)Да несколько непривычно, вот только надо внимательнее смотреть на сигнатуру у всех
SomeClass& operator=(const SomeClass&);
а у этого она иная
SomeClass& operator=(SomeClass&)
ну так это проблема довольно распространенная.
2)это почему же нельзя, вот так все правильно
Код: plaintext
1.
2.
auto_ptr<T> a;
a = new T(); 
Причина - конструктор auto_ptr<T>::auto_ptr(T*) - объявлен как explicit
3) Да ктобы спорил что быть счастливым и богатым лучше чем бедным и больным. Одна беда нестандартные они, знаешь как донимает когда у тебя несколько сторонних пакетов, в каждом из которых свой smart pointer? Вот примут C++0x полегчаетю А вот создание дубликата это вообще-то не семантика указателя. Да и что делать с опретором -> он ведь не указатель на константный объект, а вот читать лм вы будете или писать не ясно. Да и подсчет ссылок это уже не что-то невесомое, особенно в многопоточной задачке. (хотя опять же готов пойти на жертвы)
А что касается segmentation violation, это да, это плохо. Но это вопрос исторический. Это гуру напутали, а потом решили что так правильнее, чем ошибки в стандартных алгоритмах
...
Рейтинг: 0 / 0
74 сообщений из 74, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / auto_ptr или new + delete
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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