![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Заменить malloc+free на авто-поинтер. Какой поинтер выбрать (std::auto_ptr, shared_ptr, ...)?
|
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
---
Это сообщение отредактировал(а) jonie - 17.7.2009, 16:34 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Alca |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
При выходе из блока (из области видимости):
Это сообщение отредактировал(а) Alca - 17.7.2009, 16:45 |
||||
|
|||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
// оффтоп
зачем в С++ писать
если достаточно написать
Добавлено через 1 минуту и 11 секунд кстати cbSize - тавтология (count of bytes size) |
||||
|
|||||
| Alca |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Это сообщение отредактировал(а) Alca - 17.7.2009, 17:39 |
||||
|
|||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Код - супер. Все б так писали. Это сообщение отредактировал(а) Леопольд - 17.7.2009, 17:55 -------------------- вопросов больше чем ответов |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Это DDK
|
|||
|
||||
| Леопольд |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
malloc - не вызывает конструктор. new - вызывает (если не указано явно, то вызывает конструктор по умолчанию) free - не вызывает деструктор delete - вызывает Если не ошибаюсь, а я могу Разница между auto_ptr и shared_ptr: auto_ptr передаёт указатель между инстансами т.е всегда только один валидный указатель
shared_ptr использует "подсчёт ссылок"
Это сообщение отредактировал(а) Леопольд - 17.7.2009, 18:10 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Не надо будет делать free(). Если идет НемалоЕ ветвление условий, то везде ставить free() как-то не по приколу, лишний головняк. Это сообщение отредактировал(а) Alca - 17.7.2009, 19:13 |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Lazin, разчехли.
|
|||
|
||||
| Andrew121 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 21.6.2009 Репутация: нет Всего: 1 |
||||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Но зато не будет потенциальных затрат на вызовы конструторов из-за new, и деструкторов из-за delete. Так же не будут создаваться объекты смарт указателей, значит не будут вызваны их конструкторы, деструкторы, операторы копирования. Вероятно, оптимизатор всё это уберёт из бинарника, но не факт (возможно, встроит отработку деструкторов смарт поинтеров, где надо), но полагаться на оптимизатор, по моему, не стоит. Если не ошибаюсь, для драйверов, скорость весьма существенна. Это сообщение отредактировал(а) Леопольд - 17.7.2009, 22:06 -------------------- вопросов больше чем ответов |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Мне важнее стабильность работы нежели скорость выполнения. Это не драйвер.
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Выбор смарт поинтера зависит от его поведения, котрое я описал выше. auto_ptr "легче", чем shared_ptr, но его поведение не так интуитивно понятно. Ошибка, скорее всего происходит из-за неправильного использования. -------------------- вопросов больше чем ответов |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
Alca,
на фига тебе в драйвере new с его исключениями? юзай __try/__finally |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
может, тогда boost::scoped_ptr? -------------------- qqq |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
нафига там вообще нужен с++? |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Это не драйвер.
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Because it is noncopyable, it is safer than shared_ptr or std::auto_ptr for pointers which should not be copied. ... The primary reason to use scoped_ptr rather than auto_ptr is to let readers of your code know that you intend "resource acquisition is initialization" to be applied only for the current scope, and have no intent to transfer ownership. © www.boost.org Если это и есть требуемое поведение, то, кончено, лучше использовать его. Это сообщение отредактировал(а) Леопольд - 18.7.2009, 14:56 -------------------- вопросов больше чем ответов |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
А если malloc в класс завернуть?
Это сообщение отредактировал(а) Alca - 20.7.2009, 10:23 |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
конструктор копирования и оператор присвоения не определены. следовательно, будут использованы их сгенерированные компилятором аналоги. т.е. при вызове этих операций будет копироваться всего-лишь указатель на данные, а не сами данные. |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
zim22, Можешь кодом показать как надо?
Добавлено через 2 минуты и 12 секунд Мне просто надо, чтоб free вызывался автоматически. |
|||
|
||||
| DrHex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 2.5.2009 Репутация: нет Всего: нет |
Напиши свой смарт указатель.
Ну а вообще зачем использовать хейдоры от DDK если это не драйвер???? --------------------
google.com и это все. |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
вот велосипедный smart_ptr. или тебе нужно именно malloc/free?...
|
|||
|
||||
| Alca |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
А как мне с USB-ой работать (получаю вид, пид, серийник)? Добавлено через 34 секунды
Так может уже все написано... Добавлено через 4 минуты и 21 секунду
Та мне все равно, мне надо выделить память и автоматом (при выходе из блока) освободить её. Добавлено через 6 минут и 46 секунд Желательно malloc/free |
||||||
|
|||||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
| Alca |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Валиться при выходе из блока сюда (new.cpp):
Это сообщение отредактировал(а) Alca - 20.7.2009, 11:44 |
||||||||
|
|||||||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
это другая структура? |
|||
|
||||
| Alca |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Добавлено через 13 минут и 44 секунды
Это сообщение отредактировал(а) Alca - 20.7.2009, 11:54 |
||||
|
|||||
| Alca |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Разобрался:
Вместо sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) надо было пихать ulBytesReturned
Теперь понятно почему std::auto_ptr не работал. Это сообщение отредактировал(а) Alca - 20.7.2009, 13:19 |
||||
|
|||||
| Alca |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
1. Повторюсь - это не драйвер. 2. На фиг мне такой __try/__finally?
В билдере такая фишка канает, а в VS нет. Добавлено через 45 секунд Всем спасибо. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |