【问题标题】:auto_ptr for arrays数组的 auto_ptr
【发布时间】:2010-11-05 21:33:31
【问题描述】:

简而言之,我想知道数组是否有类似 auto_ptr 的类型。我知道我可以自己推出,我只是确保那里没有任何东西。

我也知道向量。但是我不认为我可以使用它们。我正在使用几个 Windows API/SDK,例如 Windows Media SDK、Direct Show API,它们是为了取回一些结构来调用一个函数,该函数需要一个指针和一个大小两次。第一次传递 NULL 作为指针来取回我必须分配的结构的大小,以便接收我正在寻找的数据。例如:

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 对象。有这样的东西吗?

【问题讨论】:

    标签: c++ arrays memory-management


    【解决方案1】:

    使用

    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 标准起的Yes。还有一个thread 已经讨论过了。


    如果您的编译器支持 C++11,则可以将 unique_ptr 用于数组。

    unique_ptr<BYTE[]> buffer(new BYTE[cbType]);
    pType = (WM_MEDIA_TYPE*)buffer.get();
    

    【讨论】:

    • 向量是否保证是连续的内存块?
    • @Heavyd 是的 - c++ 标准保证了这一点。
    • 我完全赞成使用 std::vector,但如果数组不打算调整大小(在这种情况下,根本不是真正的数组)std::vector 可能有点矫枉过正。
    • @Evan 我不同意。如果您不使用 std::vector,您将不得不使用智能指针或自己编写所有删除代码,处理异常问题等。在任何一种情况下,std::vector 都不会更复杂,而且很可能更简单。
    • 你能修正一下使用 std::vector::data() 的例子吗? data() 已经返回一个指针,所以不需要'&'。
    【解决方案2】:

    boost scoped_array 或者您可以将 boost scoped_ptr 与自定义删除器一起使用

    【讨论】:

      【解决方案3】:

      在当前的标准库中没有这方面的内容。但是,未来的标准 C++0x 有一个 unique_ptr,它取代了 auto_ptr,并且适用于数组。

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

      【讨论】:

      • 您应该明确指出,要使 unique_ptr 正常工作,您需要提供自定义删除器。
      • 不一定,请参阅“阵列的安全支持”部分
      【解决方案4】:

      不在 STL 中。 Boost 有一些类似想法的智能指针。查看scoped_arrayshared_array

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多