我正在将 C 代码转换为 C++。
有矩阵指针:
MATRIX* matrix = NULL;
matrix = new MATRIX[256];
if (matrix == NULL)
return FAIL;
memset(matrix, 0, 256*sizeof(MATRIX));
然后用不同的方法填充:
fillUpMatrix(matrix);
在 fillUpMatrix() 中:
memcpy(&matrix[start], &someOtherMatrix[pos], sizeof(MATRIX));
后来为指针调用了 memset,因为它将用一组不同的值填充:
memset(matrix, 0, 256*sizeof(MATRIX));
所以我所做的是:
auto matrix= std::make_unique<MATRIX[]>(256);
fillUpMatrix(matrix.get());
我跳过了第一个 memset
,因为我相信对于智能指针我不再需要它了。
但是我认为第二个 memset
是必需的(因为将保存新值)。那么我该如何用 C++ 编写它并考虑到我使用的是智能指针呢?我上面的转换是否正确?
最佳答案
I skipped the first
memset
since I believe I do not need it anymore for smart pointers.
你说得对,不需要它,但你不需要它的原因是你使用了 std::make_unique
,它的值初始化了数组;不是因为您使用的是智能指针。这是假设首先需要初始化。情况似乎并非如此,因为内容将要填充到一个函数中。
请注意 std::memset
和 std::memcpy
只有在类型(在本例中为 Matrix
)时才会正确运行是平凡可复制的。如果不是这种情况,则必须分别使用 std::fill_n
(或 std::fill
)和 std::copy
。如果类型也可以简单复制,则可以使用它,因此在任何情况下您都可以使用它们。
But the second memset I believe is needed (since new values will be saved).
与第一个 std::memset
类似,不清楚为什么您认为需要第二个 std::memset
(无论是在 C 还是 C++ 中)。如果新值将被写入数组,那么 std::memset
有什么影响?
So how do I write that in C++ and considering that I am using a smart pointer?
你可以像这样std::memset
一个由智能指针指向的数组:
std::memset(matrix.get(), 0, 256*sizeof(decltype(*matrix)));
或者使用 std::fill_n
代替:
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
是一个代表动态数组的 RAII 容器。您正在动态分配一个数组。 std::vector
是合适的。
将 C 转换为 C++ 不仅仅是用智能指针替换裸拥有指针。另一件事是用标准库提供的标准替换典型数据结构和算法的自定义重新实现。
关于c++ - 唯一指针的 Memset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56770160/