0

实际上,在写这个问题时,我想到了另一个更短的问题,所以我先问一下:

第一个问题(较短):

我有一个以这种方式定义的结构的标题:

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

这个语法的含义是什么?(注意结构名称和右大括号后名称的区别)

第二个问题(更长):

我有一个来自硬件制造商的代码示例,展示了如何正确初始化我使用的硬件。在代码中,制造商使用原始指针,而在我的应用程序中,我更喜欢使用 boost scoped_ptr 或 shared_ptr。问题是我要分配的内存块的大小与常规 new 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;
}
4

1 回答 1

1

这是自定义删除器的工作。

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

boost::shared_ptr(and std::shared_ptr) 接受一个删除器对象作为第二个构造函数参数,但scoped_ptr不接受。它的后代std::unique_ptr确实接受自定义删除器,您可能应该更喜欢标准设施。

于 2014-05-04T12:04:27.823 回答