увеличить scoped_ptr / shared_ptr, содержащий блок памяти другого размера, чем размер объекта, на который указывает

На самом деле, когда я писал этот вопрос, мне в голову пришёл другой, более короткий вопрос, поэтому я сначала задам его:

1-й вопрос (короче):

У меня есть заголовок со структурой, определенной таким образом:

typedef struct _CAMERA_LIST
{
....
}CAMERA_LIST, *PCAMERA_LIST;

В чем смысл этого синтаксиса? (обратите внимание на разницу в имени структуры и именах после закрывающей скобки)

2-й вопрос (дольше):

У меня есть пример кода от производителя оборудования, показывающий, как правильно инициализировать оборудование, которое я использую. В коде производитель использует сырые указатели, а в моем приложении я бы предпочел использовать boost scoped_ptr или shared_ptr. Проблема в том, что блок памяти, который я хочу выделить, имеет другой размер, чем тот, который выделяется обычным новым ObjectType;

Вот краткая версия того, что я получил с сайта производителя:

int nNumCam = 3;
CAMERA_LIST* pucl;
pucl = (CAMERA_LIST*) new BYTE [sizeof (DWORD) + nNumCam * sizeof (CAMERA_INFO)];
pucl->dwCount = nNumCam;
printf("Camera %i Id: %d", iCamera, pucl->uci[1].dwCameraID);

И вот что я хочу получить:

int nNumCam = 3;
scoped_ptr<CAMERA_LIST> pucl;
pucl.reset( (CAMERA_LIST*) new BYTE [sizeof (DWORD) + nNumCam * sizeof (CAMERA_INFO)] );
pucl->dwCount = nNumCam;
printf("Camera %i Id: %d", iCamera, pucl->uci[1].dwCameraID);

Вот как выглядит структура в точности:

typedef struct _CAMERA_LIST
{
DWORD dwCount;
CAMERA_INFO uci[1];
}CAMERA_LIST, *PCAMERA_LIST;

Вопрос в том, как заставить эту функцию работать с scoped_ptr / shared_ptr?
Также обратите внимание, что во фрагменте кода удаление блока памяти выполняется с помощью delete [], а не delete. Мне нужно использовать scoped_array? Если да, то как получить доступ к полям структуры?

есть полный пример с сайта производителей на случай, если кто-то посчитает это полезным:

INT nNumCam;
if( is_GetNumberOfCameras( &nNumCam ) == IS_SUCCESS) {
if( nNumCam >= 1 ) {
// Create new list with suitable size
CAMERA_LIST* pucl;
pucl = (CAMERA_LIST*) new BYTE [sizeof (DWORD) + nNumCam * sizeof (CAMERA_INFO)];
pucl->dwCount = nNumCam;

//Retrieve camera info
if (is_GetCameraList(pucl) == IS_SUCCESS) {
int iCamera;
for (iCamera = 0; iCamera < (int)pucl->dwCount; iCamera++) {
//Test output of camera info on the screen
printf("Camera %i Id: %d", iCamera,
pucl->uci[iCamera].dwCameraID);
}
}
}
delete [] pucl;
}

0

Решение

Это работа для пользовательского удалителя.

struct delete_bytearr {
void operator() ( void * ptr ) const
{ delete [] (BYTE *) ptr; }
};

boost::shared_ptr (а также std::shared_ptr) принять объект удаления в качестве второго аргумента конструктора, но scoped_ptr не. Его потомок std::unique_ptr действительно принимает пользовательское удаление, и вы, вероятно, предпочтете стандартные средства для продвижения вперед.

1

Другие решения


По вопросам рекламы [email protected]