На самом деле, когда я писал этот вопрос, мне в голову пришёл другой, более короткий вопрос, поэтому я сначала задам его:
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;
}
Это работа для пользовательского удалителя.
struct delete_bytearr {
void operator() ( void * ptr ) const
{ delete [] (BYTE *) ptr; }
};
boost::shared_ptr
(а также std::shared_ptr
) принять объект удаления в качестве второго аргумента конструктора, но scoped_ptr
не. Его потомок std::unique_ptr
действительно принимает пользовательское удаление, и вы, вероятно, предпочтете стандартные средства для продвижения вперед.