Модераторы: 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   Вверх
Rififi
Дата 17.7.2009, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 36



Alca, 
на фига тебе в драйвере new с его исключениями?
юзай __try/__finally
PM MAIL   Вверх
maxim1000
Дата 17.7.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(Леопольд @  17.7.2009,  22:40 Найти цитируемый пост)
auto_ptr "легче", чем shared_ptr, но его поведение не так интуитивно понятно.

может, тогда boost::scoped_ptr?


--------------------
qqq
PM WWW   Вверх
Lazin
Дата 18.7.2009, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rififi @  17.7.2009,  23:24 Найти цитируемый пост)
на фига тебе в драйвере new с его исключениями?

нафига там вообще нужен с++?
PM MAIL Skype GTalk   Вверх
Alca
Дата 18.7.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Это не драйвер.


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


Опытный
**


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

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



Цитата(maxim1000 @ 17.7.2009,  23:52)
может, тогда boost::scoped_ptr?

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


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


Эксперт
****


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

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



А если malloc в класс завернуть? 
Код

/****************************************************************************
*   Класс CXMallocT
*
*****************************************************************************/

#ifndef CXMallocTH
#define CXMallocTH
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
template<class T, size_t uiSize>
class CXMallocT {
    public:
          CXMallocT();
         ~CXMallocT();
            
    private:
        T _m_pDataT;
};
//---------------------------------------------------------------------------
template<class T, size_t uiSize>
CXMallocT<T, uiSize>::CXMallocT() :
    _m_pDataT(NULL)
{
    _m_pDataT = (T)malloc(uiSize);
}

//---------------------------------------------------------------------------
template<class T, size_t uiSize>
CXMallocT<T, uiSize>::~CXMallocT() {
    free(_m_pDataT);    
    _m_pDataT = NULL;
}
//---------------------------------------------------------------------------
#endif


/****************************************************************************
*   Использование
*
*****************************************************************************/

typedef struct {
    INT x;
    INT y;
} SMy, *PSMy;

{
    CXMallocT<PSMy, sizeof(SMy)> stM;
}


Это сообщение отредактировал(а) Alca - 20.7.2009, 10:23


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


depict1
****


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

Репутация: 24
Всего: 69



Цитата(Alca @  20.7.2009,  10:20 Найти цитируемый пост)
А если malloc в класс завернуть? 

конструктор копирования и оператор присвоения не определены. следовательно, будут использованы их сгенерированные компилятором аналоги. 
т.е. при вызове этих операций будет копироваться всего-лишь указатель на данные, а не сами данные.


--------------------
PM MAIL   Вверх
Alca
Дата 20.7.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



zim22, Можешь кодом показать как надо?

Добавлено через 2 минуты и 12 секунд
Мне просто надо, чтоб free вызывался автоматически.


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


Бывалый
*


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

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



Напиши свой смарт указатель.

Ну а вообще зачем использовать хейдоры от DDK если это не драйвер????
--------------------
google.com и это все.
PM MAIL   Вверх
zim22
Дата 20.7.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 24
Всего: 69



Цитата(Alca @  20.7.2009,  10:31 Найти цитируемый пост)
, Можешь кодом показать как надо?

вот велосипедный smart_ptr. или тебе нужно именно malloc/free?...
Код

#ifndef HANDLE_H_
#define HANDLE_H_

template <class T> 
class Handle { 
 public:
  Handle(T *p = 0) : ptr(p), use(new size_t(1)) { }
  T& operator*();
  T* operator->();
  const T& operator*() const;
  const T* operator->() const;
  // copy control: normal pointer behavior,
  // but last element will delete Handle object
  Handle(const Handle& h) : ptr(h.ptr), use(h.use) { ++*use; }
  Handle &operator=(const Handle&);
  ~Handle() { rem_ref(); }

 private:
  T *ptr;              // shared object
  size_t *use;         // count of how many objects point to *ptr

  void rem_ref() {
    if (--*use == 0) { delete ptr; delete use; }    
  }
};

template <class T>
inline Handle<T> &Handle<T>::operator=(const Handle &rhs)
{
  ++*rhs.use;
  rem_ref();
  ptr = rhs.ptr;
  use = rhs.use;
  return *this;
}

template <class T>
inline T &Handle<T>::operator*()
{
  if (ptr) return *ptr;
  throw std::runtime_error("dereference of unbound Handle");
}

template <class T>
inline T *Handle<T>::operator->()
{
  if (ptr) return ptr;
  throw std::runtime_error("access through unbound Handle");
}

template <class T>
inline const T &Handle<T>::operator*() const
{
  if (ptr) return *ptr;
  throw std::runtime_error("dereference of unbound Handle");
}

template <class T>
inline const T *Handle<T>::operator->() const
{
  if (ptr) return ptr;
  throw std::runtime_error("access through unbound Handle");
}

#endif  // HANDLE_H_



--------------------
PM MAIL   Вверх
Alca
Дата 20.7.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Ну а вообще зачем использовать хейдоры от DDK если это не драйвер????

А как мне с  USB-ой работать (получаю вид, пид, серийник)?

Добавлено через 34 секунды
Цитата

Напиши свой смарт указатель.

Так может уже все написано...  smile

Добавлено через 4 минуты и 21 секунду
Цитата

вот велосипедный smart_ptr. или тебе нужно именно malloc/free?

Та мне все равно, мне надо выделить память и автоматом (при выходе из блока) освободить её.

Добавлено через 6 минут и 46 секунд
Желательно malloc/free


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


depict1
****


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

Репутация: 24
Всего: 69



Цитата(Alca @  20.7.2009,  11:10 Найти цитируемый пост)
Та мне все равно, мне надо выделить память и автоматом (при выходе из блока) освободить её.

auto_ptr используй. 


--------------------
PM MAIL   Вверх
Alca
Дата 20.7.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

auto_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;

Код

//std::auto_ptr
std::auto_ptr<SP_DEVICE_INTERFACE_DETAIL_DATA> pFunctionClassDeviceData(new SP_DEVICE_INTERFACE_DETAIL_DATA);
assert(NULL != pFunctionClassDeviceData.get());

//malloc + free
////PSP_DEVICE_INTERFACE_DETAIL_DATA  pFunctionClassDeviceData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(ulBytesReturned);
////assert(NULL != pFunctionClassDeviceData);

pFunctionClassDeviceData.get()->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

bRes = ::SetupDiGetDeviceInterfaceDetail(hPnP, &didDeviceInterfaceData, pFunctionClassDeviceData.get(), ulBytesReturned, &ulBytesReturned, &ddDevinfoData);
/*DEBUG*/XASSERT(TRUE == bRes);
if (FALSE == bRes) {
    /*CLEAR*///free(pFunctionClassDeviceData);
    /*CLEAR*///pFunctionClassDeviceData = NULL;

    continue;   //<--- здесь выбрасывается исключение
}


Валиться при выходе из блока сюда (new.cpp):
Код

....
#include <cstdlib>
#include <new>

_C_LIB_DECL
int __cdecl _callnewh(size_t size) _THROW1(_STD bad_alloc);
_END_C_LIB_DECL

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }    //<--------------- сюда

        return (p);
        }
...




Это сообщение отредактировал(а) Alca - 20.7.2009, 11:44


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


depict1
****


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

Репутация: 24
Всего: 69



Цитата(Alca @  20.7.2009,  11:42 Найти цитируемый пост)
std::auto_ptr<SP_DEVICE_INTERFACE_DETAIL_DATA>

Цитата(Alca @  20.7.2009,  11:42 Найти цитируемый пост)
typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A

это другая структура?



--------------------
PM MAIL   Вверх
Alca
Дата 20.7.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#ifdef UNICODE
typedef SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_DEVICE_INTERFACE_DETAIL_DATA;
typedef PSP_DEVICE_INTERFACE_DETAIL_DATA_W PSP_DEVICE_INTERFACE_DETAIL_DATA;
#else
typedef SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_DEVICE_INTERFACE_DETAIL_DATA;
typedef PSP_DEVICE_INTERFACE_DETAIL_DATA_A PSP_DEVICE_INTERFACE_DETAIL_DATA;
#endif


Добавлено через 13 минут и 44 секунды
Цитата

Windows has triggered a breakpoint in Project1.exe.

This may be due to a corruption of the heap, which indicates a bug in Project1.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 - 20.7.2009, 11:54


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


Эксперт
****


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

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



Разобрался:
Вместо sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) надо было пихать ulBytesReturned

Код

#ifndef CXMallocH
#define CXMallocH
//---------------------------------------------------------------------------
template<class PointerT>
class CXMallocT {
    public:
                 CXMallocT(size_t uiSize);
                ~CXMallocT();

        PointerT pGetPtr();
            
    private:
        PointerT _m_pDataT;
};
//---------------------------------------------------------------------------
template<class PointerT>
CXMallocT<PointerT>::CXMallocT(size_t uiSize) :
    _m_pDataT(NULL)
{
    _m_pDataT = (PointerT)malloc(uiSize);
    /*DEBUG*/XASSERT(NULL != _m_pDataT);        
}
//---------------------------------------------------------------------------
template<class PointerT>
PointerT CXMallocT<PointerT>::pGetPtr() {
    /*DEBUG*/XASSERT(NULL != _m_pDataT);

    return _m_pDataT; 
}
//---------------------------------------------------------------------------
template<class PointerT>
CXMallocT<PointerT>::~CXMallocT() {        
    /*DEBUG*/XASSERT(NULL != _m_pDataT);

    free(_m_pDataT);    
    _m_pDataT = NULL;
}
//---------------------------------------------------------------------------
#endif

Код

//PSP_DEVICE_INTERFACE_DETAIL_DATA  pFunctionClassDeviceData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(ulBytesReturned);
///*DEBUG*/XASSERT(NULL != pFunctionClassDeviceData);

CXMallocT<PSP_DEVICE_INTERFACE_DETAIL_DATA> pFunctionClassDeviceData((size_t)ulBytesReturned);
pFunctionClassDeviceData.pGetPtr()->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

Теперь понятно почему std::auto_ptr не работал.

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


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


Эксперт
****


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

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



Цитата

Alca, 
на фига тебе в драйвере new с его исключениями?
юзай __try/__finally


1. Повторюсь - это не драйвер. 
2. На фиг мне такой __try/__finally?
    
Цитата

    Error    11    error C2712: Cannot use __try in functions that require object unwinding    d:\...\bgetusbinfo.cpp    126
    

    В билдере такая фишка канает, а в VS нет.

Добавлено через 45 секунд
Всем спасибо.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Страницы: (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.0857 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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