I am converting a C code to C++.
There is matrix pointer:
MATRIX* matrix = NULL;
matrix = new MATRIX[256];
if (matrix == NULL)
return FAIL;
memset(matrix, 0, 256*sizeof(MATRIX));
Then it was filled on a different method:
fillUpMatrix(matrix);
And in fillUpMatrix():
memcpy(&matrix[start], &someOtherMatrix[pos], sizeof(MATRIX));
And later on memset was called for the pointer since it will be filled with a different set of values:
memset(matrix, 0, 256*sizeof(MATRIX));
So what I did was:
auto matrix= std::make_unique<MATRIX[]>(256);
fillUpMatrix(matrix.get());
I skipped the first memset since I believe I do not need it anymore for smart pointers.
But the second memset I believe is needed (since new values will be saved). So how do I write that in C++ and considering that I am using a smart pointer? Is my conversion above correct?
I skipped the first
memsetsince I believe I do not need it anymore for smart pointers.
You're right that it isn't needed, but the reason for not needing it specifically that you used std::make_unique, which value initialises the array; not because you're using smart pointers. That is assuming initialisation is needed in the first place. That doesn't appear to be the case, since the content is about to be filled in a function.
Do take into consideration that std::memset and std::memcpy behave correctly only if the type (Matrix in this case) is trivially copyable. If that is not the case, you must use std::fill_n (or std::fill) and std::copy respectively. Which can be used if the type is trivially copyable too, so you might as well use them in any case.
But the second memset I believe is needed (since new values will be saved).
Similar to the first std::memset, It's unclear why you think that a second std::memset is needed (whether in C or C++). If the new values are going to be written over the array, then what effect does the std::memset have?
So how do I write that in C++ and considering that I am using a smart pointer?
You can std::memset an array pointed by smart pointer like this:
std::memset(matrix.get(), 0, 256*sizeof(decltype(*matrix)));
Or using std::fill_n instead:
std::fill_n(matrix.get(), 256, MATRIX{});
Hmm my thought was since it was
MATRIX* matrix = NULL;then I should use a smart pointer.
std::vector is a RAII container that represents a dynamic array. You're dynamically allocating an array. std::vector is appropriate.
Converting C to C++ is not just about replacing bare owning pointers with smart pointers. Another thing to do is to replace custom re-implementations of typical data structures and algorithms with the standard ones provided by the standard library.
vector<MATRIX> would solve many problems.new doesn't return null, but throws. Hence null check has no effect (unless nothrow is used).MATRIX class which would initialize all members of MATRIX. You can have (or prevent) copy/move constructors/assignment operators. Consider using =default and =delete with special member functions.memcpy etc may corrupt the state of some non-POD members in MATRIX type (like std::string, std::vector). Such undefined-behaviours are hard to detect, hence don't use any mem* functions.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With