Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заменить malloc+free на авто-поинтер, Какой поинтер выбрать? 
V
    Опции темы
Alca
Дата 17.7.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Заменить malloc+free на авто-поинтер. Какой поинтер выбрать (std::auto_ptr, shared_ptr, ...)?
Код

//...
typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A {
    DWORD  cbSize;
    CHAR   DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A;

typedef SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_DEVICE_INTERFACE_DETAIL_DATA;
//...

void vSomeFunc() {
    //...  
    
    PSP_DEVICE_INTERFACE_DETAIL_DATA  pData = NULL;    //std::auto_ptr, shared_ptr, ...
    pData        = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(ulBytesReturned);
    assert(NULL != pData);

    bRes = ::SetupDiGetDeviceInterfaceDetail(hPnP, &didDeviceInterfaceData, /*in, out*/pData.get()/**/, ...);
    if (FALSE == bRes) {
        /*CLEAR*/free(pData);
        /*CLEAR*/pData = NULL;

        continue;
    }

    //...  
}




--------------------
PM WWW ICQ Skype Jabber   Вверх
jonie
Дата 17.7.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



---

Это сообщение отредактировал(а) jonie - 17.7.2009, 16:34


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Alca
Дата 17.7.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Код

std::auto_ptr<SP_DEVICE_INTERFACE_DETAIL_DATA> pFunctionClassDeviceData(new SP_DEVICE_INTERFACE_DETAIL_DATA());

При выходе из блока (из области видимости):
Цитата

Windows has triggered a breakpoint in Project.exe.
This may be due to a corruption of the heap, which indicates a bug in Project.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while Banan.exe has focus.
The output window may have more diagnostic information.



Это сообщение отредактировал(а) Alca - 17.7.2009, 16:45


--------------------
PM WWW ICQ Skype Jabber   Вверх
GoldFinch
Дата 17.7.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



// оффтоп

зачем в С++ писать 
Код

typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A {
    DWORD  cbSize;
    CHAR   DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A;

если достаточно написать
Код

struct SPDeviceInterfaceDetailDataA {
    DWORD  cbSize;
    CHAR   DevicePath[ANYSIZE_ARRAY];
};


Добавлено через 1 минуту и 11 секунд
кстати cbSize - тавтология (count of bytes size)
PM MAIL ICQ   Вверх
Alca
Дата 17.7.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

зачем в С++ писать

Код

/*++

Copyright (c) Microsoft Corporation.  All rights reserved.

Module Name:

    setupapi.h

Abstract:

    Public header file for Windows NT Setup and Device Installer services Dll.

--*/
.
.
.
.
typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A {
    DWORD  cbSize;
    CHAR   DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A;
.
.
.


Это сообщение отредактировал(а) Alca - 17.7.2009, 17:39


--------------------
PM WWW ICQ Skype Jabber   Вверх
Леопольд
Дата 17.7.2009, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Alca @ 17.7.2009,  17:38)
Copyright © Microsoft Corporation.  All rights reserved.

Код - супер. Все б так писали. smile  А вообще, от С++ я ничего здесь не увидел. Больше похоже на чистый С. Может, не стоит сюда смарт указатели добавлять? Кстати, а в чём здесь выгода от них?

Это сообщение отредактировал(а) Леопольд - 17.7.2009, 17:55


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Alca
Дата 17.7.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Это DDK  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Леопольд
Дата 17.7.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Alca @ 17.7.2009,  16:12)
Заменить malloc+free на авто-поинтер. Какой поинтер выбрать (std::auto_ptr, shared_ptr, ...)?

malloc - не вызывает конструктор.
new - вызывает (если не указано явно, то вызывает конструктор по умолчанию)

free - не вызывает деструктор
delete - вызывает

Если не ошибаюсь, а я могу smile, смарт указатели пользуют new.
Разница между auto_ptr и shared_ptr:

auto_ptr передаёт указатель между инстансами т.е всегда только один валидный указатель
Код

std::auto_ptr<int> aptr1(new int);
std::auto_ptr<int> aptr2 = aptr1; // aptr1 больше не указыват ни на что, память будет освобождена при разрушении aptr2


shared_ptr использует "подсчёт ссылок"
Код

boost::shared_ptr<int> sptr1(new int);
boost::shared_ptr<int> sptr2 = aptr1;  // теперь оба указателя указывают на одну область, память будет освобождена при разрушении последнего shared_ptr, который указывал на эту область


Это сообщение отредактировал(а) Леопольд - 17.7.2009, 18:10


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Alca
Дата 17.7.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

Кстати, а в чём здесь выгода от них

Не надо будет делать free(). Если идет НемалоЕ ветвление условий, то везде ставить free() как-то не по приколу, лишний головняк.
 smile 

Это сообщение отредактировал(а) Alca - 17.7.2009, 19:13


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 17.7.2009, 19:33 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Alca @  17.7.2009,  17:56 Найти цитируемый пост)
Это DDK

а потом они говорят, что винда - глючная smile 
PM MAIL Skype GTalk   Вверх
Alca
Дата 17.7.2009, 19:36 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Lazin, разчехли.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Andrew121
Дата 17.7.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 21.6.2009

Репутация: нет
Всего: 1



Цитата(Lazin @  17.7.2009,  19:33 Найти цитируемый пост)
а потом они говорят, что винда - глючная

 smile 
PM MAIL   Вверх
Леопольд
Дата 17.7.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Alca @ 17.7.2009,  19:12)
Не надо будет делать free(). Если идет НемалоЕ ветвление условий, то везде ставить free() как-то не по приколу, лишний головняк.
 smile

Но зато не будет потенциальных затрат на вызовы конструторов из-за new, и деструкторов из-за delete. Так же не будут создаваться объекты смарт указателей, значит не будут вызваны их конструкторы, деструкторы, операторы копирования. Вероятно, оптимизатор всё это уберёт из бинарника, но не факт (возможно, встроит отработку деструкторов смарт поинтеров, где надо), но полагаться на оптимизатор, по моему, не стоит. Если не ошибаюсь, для драйверов, скорость весьма существенна. smile

Это сообщение отредактировал(а) Леопольд - 17.7.2009, 22:06


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Alca
Дата 17.7.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Мне важнее стабильность работы нежели скорость выполнения. Это не драйвер.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Леопольд
Дата 17.7.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Alca @ 17.7.2009,  22:07)
Мне важнее стабильность работы нежели скорость выполнения. Это не драйвер.

Выбор смарт поинтера зависит от его поведения, котрое я описал выше. auto_ptr "легче", чем shared_ptr, но его поведение не так интуитивно понятно. Ошибка, скорее всего происходит из-за неправильного использования.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1401 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.