一行初始化pointer(new uint8_t[height * width*3])

Initialize pointer(new uint8_t[height * width*3]) in one line

我正在学习 c++ 课程,有些事情我希望能够在一行中完成。我有以下 class:

class example {
private:
    int height, width;
    std::unique_ptr<uint8_t[]> pointer = nullptr;
public:
    example()
        :pointer(new uint8_t[height * width * 3]) // this works
    {}
};

但我宁愿像这样初始化 pointer 成员内联:

unique_ptr<uint8_t[]> pointer = new uint8_t[height * width * 3]; // doesnt work

这可能吗?

可以,这会起作用:

struct P {
    size_t height, width;
    std::unique_ptr<size_t[]> vals = std::make_unique<size_t[]>(height * width * 3);
};

Live example

但是不要这样做。为什么?

如果我这样做:

struct P {
    size_t height;
    std::unique_ptr<size_t[]> vals = std::make_unique<size_t[]>(height * width * 3);
    size_t width;
};

我有 未定义的行为,因为我将使用 width 未初始化的。至少如果我这样做:

struct P {
    P(size_t h, size_t w) :
       height{h}, width{w},
       vals{height * width * 3}
    {} // Initialization in the initialization list

    size_t height;
    std::vector<size_t> vals;
    size_t width;
};

然后会出现一条警告,指出初始化列表中的元素顺序错误。由于我应该将警告作为错误进行编译,幸运的是,我将无法编译这个有缺陷的代码。最后,我使用的是矢量,这绝对是您要找的,使用起来要好得多:)

问题是唯一指针的 operator= 没有为保存数组的唯一指针定义。改为使用构造函数:

unique_ptr<uint8_t[]> pointer {new uint8_t[height * width * 3]()};

std::make_unique函数:

std::unique_ptr<uint8_t[]> pointer = std::make_unique<uint8_t[]>(height * width * 3);