唯一指针的 Memset

kee*_*han 6 c++ smart-pointers

我正在将 C 代码转换为 C++。

有矩阵指针:

MATRIX* matrix = NULL;
matrix = new MATRIX[256];

if (matrix == NULL)
   return FAIL;
memset(matrix, 0, 256*sizeof(MATRIX));

Run Code Online (Sandbox Code Playgroud)

然后用不同的方法填充它:

fillUpMatrix(matrix);
Run Code Online (Sandbox Code Playgroud)

在 fillUpMatrix() 中:

memcpy(&matrix[start], &someOtherMatrix[pos], sizeof(MATRIX));
Run Code Online (Sandbox Code Playgroud)

后来 memset 被调用来获取指针,因为它将用一组不同的值填充:

memset(matrix, 0, 256*sizeof(MATRIX));
Run Code Online (Sandbox Code Playgroud)

所以我所做的是:

auto matrix= std::make_unique<MATRIX[]>(256);
fillUpMatrix(matrix.get());
Run Code Online (Sandbox Code Playgroud)

我跳过了第一个,memset因为我相信智能指针不再需要它了。但是memset我认为需要第二个(因为将保存新值)。那么我如何在 C++ 中编写它并考虑到我使用的是智能指针?我上面的转换正确吗?

eer*_*ika 4

我跳过了第一个memset,因为我相信我不再需要它来实现智能指针。

你是对的,不需要它,但是你不需要它的原因是你使用了std::make_unique,哪个值初始化数组;不是因为您使用了智能指针。这是假设首先需要初始化。情况似乎并非如此,因为内容将被填充到函数中。

请考虑这一点std::memset,并且std::memcpy仅当类型(Matrix在本例中)可轻松复制时才能正确运行。如果不是这种情况,则必须分别使用std::fill_n(或std::fill) 和std::copy。如果类型也可以简单复制,则可以使用它们,因此您在任何情况下都可以使用它们。

但我认为需要第二个 memset(因为将保存新值)。

与第一个类似std::memset,不清楚为什么您认为std::memset需要第二个(无论是在 C 还是 C++ 中)。如果新值要写入数组,那么会产生什么影响std::memset?

那么考虑到我使用的是智能指针,我该如何用 C++ 编写它呢?

您可以std::memset像这样使用智能指针指向的数组:

std::memset(matrix.get(), 0, 256*sizeof(decltype(*matrix)));
Run Code Online (Sandbox Code Playgroud)

或者使用std::fill_n:

std::fill_n(matrix.get(), 256, MATRIX{});
Run Code Online (Sandbox Code Playgroud)

嗯,我的想法是从那时起MATRIX* matrix = NULL;我应该使用智能指针。

std::vector是表示动态数组的 RAII 容器。您正在动态分配一个数组。std::vector是合适的。

将 C 转换为 C++ 不仅仅是用智能指针替换裸露的拥有指针。另一件要做的事情是将典型数据结构和算法的自定义重新实现替换为标准库提供的标准数据结构和算法。