如何复制 C++ 指针数据? [复制]

Posted

技术标签:

【中文标题】如何复制 C++ 指针数据? [复制]【英文标题】:How to copy C++ pointer data? [duplicate] 【发布时间】:2021-10-05 16:29:38 【问题描述】:

我有一个指向 A 类型对象的指针:

一个*一个;

它是由初始化函数中的参数设置的,但我无法知道是否使用了从 A 派生的类型,我无法测试所有可能性(也不应该,无论如何)。

我需要制作 a 指向的对象的精确副本,并让新的指针 b 指向新的重复对象。它必须复制所有数据,而不仅仅是指针本身,因为我以后更改 *b 时不能覆盖原始数据。我可以试试这个:

A* a = param_a;

温度 = *a;

A* b = 新 A();

*b = 温度;

但是我担心当我尝试将数据从 *a 存储到 temp 时,如果它实际上没有实例化为 A,那么将没有足够的空间来保存它。然后当我将 *b 实例化为 A,然后用 temp 替换它时,再次没有足够的空间。我该怎么做?

【问题讨论】:

这能回答你的问题吗? Copying a Polymorphic object in C++ 我认为这行不通,因为它似乎说我必须创建一个克隆函数,然后在每个派生类型中覆盖它(但我希望它与所有派生类型一起工作而不创建它们的人实现特定的克隆功能以确保它们正常工作),或者我可以使用模板。虽然理论上我可以使用模板,但我认为这也行不通,原因有两个: - 模板可以允许任何可能的类型,但我需要将其限制为仅 A 的子类型,我认为我不能用模板来做到这一点(可以吗?)。 - 我必须列出另一种类型的对象(我们称之为 X),并且每个对象最终都必须能够列出某种类型的对象,要么是 A,要么是从 A 派生的,但是它们都必须由 A 的原型制成,复制以使所有都在列表中,并且列表中的所有对象必须是相同的类型。换句话说,如果 B 和 C 从 A 派生,那么一个 X 可以包含一个 As 列表,另一个可以包含一个 B 列表,另一个可以包含一个 C 列表,但是所有 X 也将在一个列表中,并且我不要认为我可以将一个 X、一个 X 和一个 X 都放在同一个列表中,可以吗? @ThisIsMe 是的,您可以将模板类型限制为仅从特定类型派生。如果你有一个base*,你会发现这个问题,当你取消引用它时,你只会从它那里得到一个base&,因为那是静态类型。您将无法复制它实际指向的派生对象,因为您无法仅从指针中获取该信息。这就是为什么我们有克隆成语的原因。它通过派生类添加一个需要重写的额外虚函数的小要求解决了整个问题。 【参考方案1】:

使用内存 它将num字节的值从source指向的位置直接复制到destination指向的内存块。REFERENCE

memcpy(p2, p1, 100 * sizeof(int));

当然你也可以这样做

int A = 4;
int* pointer1 = &A;
int* pointer2 = pointer1;

【讨论】:

这是 C++ 中完全错误的解决方案。 memcpy() 不适用于具有指针成员的复杂 c++ 类。 OP 不知道源的真实类型,所以sizeof 不起作用。 但是我可以做这样的事情,对吧?: A* a = param_a; A* b = 新 A(); memcpy(b, a, sizeof(a));这可能行得通,除了因为 b 仅分配用于保存 A 的大小,我可能会遇到内存访问错误或其他问题。我想知道是否可以从本页底部使用模板示例:***.com/questions/5148706/… 但前提是我在模板调用中使用了 decltype,如下所示:A a = param_a; A* b = 克隆(a);那行得通吗?我以前从未使用过 decltype。 但我可以做这样的事情,对吗?你可以,而且看起来它有效,但如果它有效,那只是因为运气不好。永远不要指望运气。

以上是关于如何复制 C++ 指针数据? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将 Double 复制到 C++ 中的 void 指针 [关闭]

如何避免共享指针的复制赋值运算符c ++

如何通过JNI将java中的对象的地址赋值给c++指针变量

C++ Boost 序列化、构造函数和数据复制

我们可以使用单个指针实现双向链表吗? [复制]

C++学习基础七——深复制与浅复制