1

我正在寻找一种使用 C++11 中引入的新指针模板来管理数组范围的干净方法,这里的典型场景是调用 win32 api 函数时。

我在这里发帖是因为尽管有很多关于更复杂问题的讨论,但这个相对简单的场景似乎没有被讨论过,我想知道是否有比我现在开始做的更好的选择。

#include <memory>

void Win32ApiFunction(void* arr, int*size)
{
    if(arr==NULL)
        *size = 10;
    else
    {
        memset(arr,'x',10);
        ((char*)arr)[9]='\0';
    }
}

void main(void)
{
    // common to old and new
    int size;
    Win32ApiFunction(NULL,&size);

    // old style - till now I have done this for scope reasons
    if(char* data = new char[size])
    {
        Win32ApiFunction(data,&size);
        // other processing
        delete [] data;
    }

    // new style - note additional braces to approximate
    // the previous scope - is there a better equivalent to the above?
    {
        std::unique_ptr<char[]> data1(new char[size]);
        if(data1)
        {
            Win32ApiFunction(data1.get(),&size);
            // other processing
        }
    }
}
4

1 回答 1

11

最干净的方法是使用std::vector,即使是 C++98 也保证它与 C 风格的数组兼容(即它被存储为单个连续块),您只需将指向第一个元素的指针传递给您的Win32ApiFunction.

std::vector<char> data(size);
Win32ApiFunction(&data[0], &size);

在 C++11 中有一个特殊的成员函数std::vector<T>::data(),它返回指向数组开头的指针(因此您无需担心operator& ()向量值类型的重载和 using std::addressof,请参阅如何在 operator& 时可靠地获取对象的地址是否重载?对于重载的 C++98 问题operator&())。

于 2012-02-23T12:08:39.067 回答