c++ - 唯一指针的 Memset

标签 c++ smart-pointers

我正在将 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::memsetstd::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/

相关文章:

c++ - 将 unique_ptr 重置为字符数组

c++ - 类中 std::vector 的析构函数

c++ - 如何从 C++ 中的 DLL 导出纯虚函数?

c++ - 智能指针和长时间运行的方法

c++ - 如何初始化 std::unique_ptr<std::unique_ptr<T>[]>?

c++ - 如何将抽象基类 unique_ptr 添加到 map 中?

c++ - 为 C++ 模拟和洗牌一副牌?

c++ - 为什么 OpenCV 构造函数在 iPhone 5 而不是 iPhone 6/iPad 上工作?

c++ - 比较模板中的不同类型

c++ - 为什么 weak_from_this() 总是返回空的弱指针?