首页 > 解决方案 > 在一行中初始化指针(new uint8_t[height * width*3])

问题描述

我正在学习一c++门课程,并且我希望能够在一行中做一些事情。我有以下课程:

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

这可能吗?

标签: c++pointersunique-ptrprocedural

解决方案


可以,这将工作:

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

活生生的例子

要这样做。为什么?

如果我这样做:

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

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


推荐阅读