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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заменить malloc+free на авто-поинтер, Какой поинтер выбрать? 
V
    Опции темы
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   Вверх
Страницы: (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.0925 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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