【问题标题】:Will memmove function share the same address as the temporary pointer?memmove 函数会与临时指针共享相同的地址吗?
【发布时间】:2016-11-16 22:53:34
【问题描述】:

假设有一个指向浮点值数组的指针:float *source;,我们知道它的大小为int sourcesize;

有一个已经实现的函数,它从inputVecsouce 数组添加一个元素:

void addRecord(const float* inputVec, int& sourcesize)
{
   int inputVecSize = sourcesize;
   memmove( (float*)&(source[inputVecSize]), inputVec, sizeof(float));
}

现在,我想从源数组的mth 元素中复制 1 个元素并将其附加到源端。通过使用上面的 addRecord,我实现了如下功能:

// suppose m is smaller than the current sourcesize
void copyRecord(const float* source, int& m)
{
    float* temporary = new float;
    memcpy( temporary, (float*)&(source[m]), sizeof(float));
    addRecord(temporary, sourcesize);
    delete temporary;
}

看来addRecord函数中的memmove调用可能会共享临时变量位置。因此,也许我最后不应该删除temporary。但我想也许他们不共享相同的地址,那么在这种情况下我应该删除temporary

那么,我到底该不该删除temporary呢?

或者,有没有更好的方法通过使用函数 addRecord 将元素从 source 数组复制到其末尾?

【问题讨论】:

  • 如果您将 m 浮点数复制到任意单个浮点数,则此代码没有希望工作。我强烈建议您使用像 std::vector 这样的标准库容器来存储这些数据。
  • sizeof(JtFloat32)sizeof(float) 可能不一样 - 否则为什么会有 JtFloat32?如果它们不同,float* temporary = new float; memcpy( temporary, (JtFloat32*)&(source[m]), sizeof(JtFloat32)); 就麻烦了。
  • 绝对最少需要JtFloat32* temporary = new JtFloat32[m]。您还应该将方法签名更改为 JtFloat32* 以避免强制转换。
  • 什么是size,应该是sourcesize
  • 改变了我的错误

标签: c++ arrays heap-memory memmove


【解决方案1】:

memmove() 复制temporary 指向的内存的内容。该副本不依赖于原始temporary,因此在调用memmove() 后将其删除是完全安全的。

但是一开始就不需要临时的,你可以直接从原始数组中复制。

addRecord(&(source[m]), sizeof source[m]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多