boost scoped_ptr / shared_ptr持有与指向的对象大小不同的内存块

时间:2014-05-04 11:30:31

标签: c++ shared-ptr scoped-ptr

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

第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;
}

1 个答案:

答案 0 :(得分:1)

这是自定义删除工具。

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

boost::shared_ptr(和std::shared_ptr)接受删除对象作为第二个构造函数参数,但scoped_ptr没有。它的后代std::unique_ptr确实接受了一个自定义删除器,你应该更喜欢前进的标准设施。