一行初始化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);
};
但是不要这样做。为什么?
如果我这样做:
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);
我正在学习 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);
};
但是不要这样做。为什么?
如果我这样做:
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);