关于C++ memcpy复制行为及数组对象地址复制方法的技术咨询
关于C++ memcpy与数组地址复制的问题解答
先直接回应你的核心疑问:
- 对于你的场景(
m_data是Node<T>*类型的指针数组),memcpy确实会把原数组中每个指针的值(也就是指向Node<T>对象的内存地址)复制到新数组里。但要明确:memcpy的本质是字节逐位复制,它只会复制目标内存区域的原始字节内容,不会刻意区分是对象还是地址——具体复制什么完全取决于你的数组存储的内容。
分情况拆解memcpy的行为
我把两种常见数组类型分开说明,你可以对应自己的场景参考:
如果数组存的是对象本身(比如
Node<T> m_data[])memcpy会把原数组中每个Node<T>对象的所有字节复制到新数组,这属于浅拷贝。如果Node<T>内部包含动态分配的内存(比如char*、其他自定义指针),这种复制会导致新旧数组的对象指向同一块内存,后续析构时会出现重复释放的问题——这很可能就是你提到的“Node类定义相关问题”的根源。如果数组存的是指针(也就是你的场景:
Node<T>* m_data[])memcpy复制的是每个指针变量的字节内容,也就是指针指向的内存地址。复制完成后,新数组里的每个指针和原数组对应的指针会指向同一个Node<T>对象。这种情况下,memcpy并没有复制Node<T>对象本身,只是复制了指向它们的地址。
如何复制数组中对象的地址?
具体实现要看你的数组原本存储的内容:
- 如果已经是指针数组(像你的
m_data):直接用memcpy就可以完成地址的复制,因为数组元素本身就是对象的地址。举个简单的代码示例:// 假设old_data是原指针数组,new_data是扩容后的新指针数组,size是原数组元素个数 memcpy(new_data, old_data, size * sizeof(Node<T>*)); - 如果数组存的是对象本身(
Node<T>数组):你需要创建一个指针数组,然后遍历原数组,把每个对象的地址存进去:Node<T>* new_ptr_array = new Node<T>*[size]; for (long i = 0; i < size; ++i) { new_ptr_array[i] = &m_data[i]; // 取每个对象的地址存入指针数组 }
关于你扩容场景的额外提示
如果你的Node<T>类包含非平凡的构造/析构函数(比如有动态内存管理逻辑),不要用memcpy来复制对象数组,应该循环调用拷贝构造函数来创建新对象:
// 假设扩容后新数组是new_data,类型是Node<T>*(对象数组的指针) new_data = new Node<T>[new_size]; for (long i = 0; i < m_size; ++i) { new_data[i] = m_data[i]; // 调用拷贝构造函数,完成深拷贝(如果Node类正确实现的话) }
这样可以避免浅拷贝带来的内存泄漏或双重释放问题。
内容的提问来源于stack exchange,提问作者Switching Systems
相关产品推荐
相关产品推荐

