使用memcpy从原始指针复制到智能指针

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

我正在尝试将旧式C代码转换为使用智能指针。并遇到了以下内容(只是片段,让我开始学习):

MATRIX* cache;
---
cache = new MATRIX[numRow*numCol];
if (cache == NULL) 
{
    return FAIL;
}
---
memset(cache, 0, sizeof(MATRIX)*numRow*numCol);
---
memcpy(cache, matrix, sizeof(MATRIX)*numRow*numCol);
Run Code Online (Sandbox Code Playgroud)

我试图将它们转换成这样:

std::unique_ptr<MATRIX[]> cache;
---
cache = std::make_unique<MATRIX[]>(numRow*numCol);
if (cache == NULL) 
{
    return FAIL;
}
---
cache.reset();
Run Code Online (Sandbox Code Playgroud)

它是否正确?还有更好的写法吗?另外,我不知道该怎么办了memcpyC ++的对手

memcpy(cache, matrix, sizeof(MATRIX)*numRow*numCol);
Run Code Online (Sandbox Code Playgroud)

matrix只是MATRIX *类型的原始指针。有什么建议么??非常感谢!

Sou*_*abh 7

您的实现是正确的,但是您不必调用reset即可清理内存。它会由std::unique_ptr类自动处理,要访问唯一的指针内存,我们可以使用get如下方法:

cache.get();
Run Code Online (Sandbox Code Playgroud)

因此,您memcpy将看起来像

memcpy(cache.get(), matrix, sizeof(MATRIX)*numRow*numCol);
Run Code Online (Sandbox Code Playgroud)

  • 当分配失败时,make_unique抛出异常,它调用new运算符。代码“ cache == NULL”将永远不会执行,您应该将其删除。也要使用`nullptr`,而不是`NULL`。 (4认同)