代码之家  ›  专栏  ›  技术社区  ›  heavyd

数组的自动指针

  •  32
  • heavyd  · 技术社区  · 15 年前

    简言之,我想知道数组是否有类似auto-ptr的类型。我知道我可以自己滚,我只是确定那里已经没有什么东西了。

    我也知道向量。但是我觉得我不能用它们。我正在使用一些Windows API/SDK,例如Windows Media SDK、Direct Show API,以便返回一些结构来调用一个需要指针和大小两倍的函数。第一次将空值作为指针传递,以返回为接收正在查找的数据而必须分配的结构的大小。例如:

    CComQIPtr<IWMMediaProps> pProps(m_pStreamConfig);
    DWORD cbType = 0;
    WM_MEDIA_TYPE *pType = NULL;
    
    hr = pProps->GetMediaType(NULL, &cbType);
    CHECK_HR(hr);
    
    pType = (WM_MEDIA_TYPE*)new BYTE[cbType];   // Would like to use auto_ptr instread
    hr = pProps->GetMediaType(pType, &cbType);
    CHECK_HR(hr);
    
    // ... do some stuff
    
    delete[] pType;
    

    由于cbtype的返回值通常大于sizeof(wm_media_type),因为它有一个指向另一个结构的指针,所以我不能只分配wm_media_type对象。外面有这样的东西吗?

    4 回复  |  直到 9 年前
        1
  •  42
  •   Community THelper    7 年前

    使用

    std::vector<BYTE> buffer(cbType);
    pType = (WM_MEDIA_TYPE*)&buffer[0];
    

    或自 C++ 11

    std::vector<BYTE> buffer(cbType);
    pType = (WM_MEDIA_TYPE*)buffer.data();
    

    相反。


    附加: 如果有人问 Vectors are guaranteed to be contiguous 答案是 是的 由于C++ 03标准。还有一个 thread 已经讨论过了。


    如果 C++ 11 编译器支持的唯一指针可用于数组。

    unique_ptr<BYTE[]> buffer(new BYTE[cbType]);
    pType = (WM_MEDIA_TYPE*)buffer.get();
    
        2
  •  10
  •   Evan Teran Benoît    15 年前

    促进 scoped_array 或者你可以使用Boost scoped_ptr 使用自定义删除程序

        3
  •  9
  •   Jem    15 年前

    在当前的std库中没有此功能。然而,未来的标准C++0x有一个UnQuyJPTR,它替换AutoYPTR,并与数组一起工作。

    第一个实现可以在这里找到: unique_ptr

        4
  •  3
  •   Fred Larson    15 年前

    不在STL中。Boost有一些类似想法的智能指针。退房 scoped_array shared_array