I am following a c++
course and there is something I would like to be able to do in one line. I have the following 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
{}
};
But I would rather initialize the pointer
member inline like:
unique_ptr<uint8_t[]> pointer = new uint8_t[height * width * 3]; // doesnt work
Is this possible?
You can, this will work:
struct P {
size_t height, width;
std::unique_ptr<size_t[]> vals = std::make_unique<size_t[]>(height * width * 3);
};
But don't do this. Why?
If I do this:
struct P {
size_t height;
std::unique_ptr<size_t[]> vals = std::make_unique<size_t[]>(height * width * 3);
size_t width;
};
I have undefined behaviour, because I will be using width
uninitialized. At least if I do this:
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;
};
Then a warning will appear stating out of order elements in the initializer list. And since I should be compiling with warnings as errors, I will, luckily, be unable to compile this buggy code. Finally, I am using a vector, which is definitely what you are looking for, it is much much nicer to use :)