c++ - 在一行中初始化指针(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
这可能吗?
解决方案
你可以,这将工作:
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;
};
然后会出现一个警告,说明初始化列表中的元素乱序。而且由于我应该将警告作为错误进行编译,幸运的是,我将无法编译这个有缺陷的代码。最后,我使用了一个向量,这绝对是您正在寻找的,它使用起来要好得多:)
推荐阅读
- php - 如何使用另一个 php 文件中的变量设置默认类属性值?
- windows - 无法侦听特定的 Windows 10 端口
- git - Visual Studio Code SSH 推送和拉取在命令行中工作,但不能使用推送和拉取按钮
- python-appium - 无法启动 Appium 服务器。它显示 [Error Starting appium server: listen EADDRINUSE 0.0.0.0:4723]
- javascript - 如何禁用 eslint 上的错误(更漂亮/更漂亮)?
- ios - 在 IOS 应用程序的后台接收来自 firebase 的通知?
- javascript - 如何在 Reactjs 中更改 CKEditor 5 的配置
- python - 希望允许用户使用 django 模型和表单来选择日期时间
- applescript - 基本的 iTunes AppleScript 问题
- java - 循环通过firebase时的空指针