实际上在写这个问题的时候,我想到了另一个较短的问题,所以我先问一下:
第1个问题(更短):
我有一个以这种方式定义的结构头:
typedef struct _CAMERA_LIST
{
....
}CAMERA_LIST, *PCAMERA_LIST;
这种语法的含义是什么? (注意结构名称和结束括号后的名称的区别)
第二个问题(更长):
我有一个来自硬件制造商的代码示例,展示了如何正确初始化我使用的硬件。代码制造商使用原始指针,在我的应用程序中,我更喜欢使用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 []而不是删除来完成的。我需要使用scoped_array吗?如果是这样,如何访问struct fields?
制造商网站上有一个完整的例子,以防有人发现它有用:
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 :(得分:1)
这是自定义删除工具。
struct delete_bytearr {
void operator() ( void * ptr ) const
{ delete [] (BYTE *) ptr; }
};
boost::shared_ptr
(和std::shared_ptr
)接受删除对象作为第二个构造函数参数,但scoped_ptr
没有。它的后代std::unique_ptr
确实接受了一个自定义删除器,你应该更喜欢前进的标准设施。