【问题标题】:Does C++ memcopy copy the memory addresses to another array?C++ memcpy 是否将内存地址复制到另一个数组?
【发布时间】:2018-09-19 04:49:49
【问题描述】:

当使用memcopy时,它只是复制数组中的对象还是复制对象的内存地址并将其放入新数组中?

如果没有,有没有办法复制数组中对象的地址?

以下是数组定义:

private:
Node<T>* m_data;
long     m_size; 
bool     m_asc; 
Node<T>* m_curr;

我有一个插入m_data 的方法,但有时m_data 需要扩展并因此复制到临时数组中。问题在于,在 Node 类定义(如下所示)中,通过保存它们的指针来连接数组中的连续元素。如果我将一个列表的元素复制到另一个列表中,它会更改它们的内存地址,这会导致使用指针的更改不会反映在数组的元素中。有没有办法解决这个问题?

Node<T>* m_next; // pointer to successor element. 
Node<T>* m_prev; // pointer to predecessor element.

【问题讨论】:

  • 你指的是std::memcpy吗?
  • memcpy 与非 POD C++ 类一起使用充其量是有风险的(而且通常不仅仅是直接损坏)
  • 通常,如果您维护一个列表结构,您不会将元素存储在数组中。相反,您使用new 创建它们,然后它们只能通过遍历列表来访问。否则,你必须解决你所说的问题。那么,有没有机会,而不是解决它,你只是不需要数组访问,并且只使用列表访问就可以了吗?
  • 有用的关键字:std::copy,复制构造函数,三法则。
  • memcpy 复制 字节。 C++初学者不应该使用它。

标签: c++ arrays pointers memory memory-management


【解决方案1】:

从历史上看,memcpy() 仅用于复制内存块,没有任何假设“内容字节本质上应该是什么”。所以,经验法则:

  • 可以通过 memcpy 复制普通的旧数据(又名 POD)。但是,这并不意味着您只能这样做 - STL 容器也可以满足您的需求(对于初学者来说可能是更好的选择)。
  • 在任何其他情况下,您都必须使用像 std::vector 这样的 STL 容器。否则,你就是在自找麻烦。

【讨论】:

    猜你喜欢
    • 2014-02-12
    • 2021-12-27
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2012-01-26
    • 2011-04-16
    相关资源
    最近更新 更多