所以我有一个类似
的结构struct GetResultStructure
{
int length;
char* ptr;
};
我需要一种方法来制作它的完整副本,这意味着我需要一个副本,以便在原始结构中具有新ptr指向的数据副本。有可能吗?我的意思是我拥有的任何包含ptrs的结构都会有一些字段的长度我需要一个函数来复制我的结构,通过给定的长度数组来处理它们所指向的所有ptrs和数据......有什么很酷的增强函数吗?或者以任何方式创建这样的功能?
答案 0 :(得分:7)
对于您描述的特定方案,请使用std::vector
或其他一些序列容器。如果你这样做,那么简单地复制GetResultStructure
类型的对象也会复制指向数据:
struct GetResultStructure {
std::vector<char> data;
};
GetResultStructure a = GetData();
GetResultStructure b = a; // a and b have distinct, equivalent data vectors
通常,当您需要自己实现时,可以通过实现复制构造函数和复制赋值运算符来实现。最简单的方法是使用复制和交换习语,在What is the copy-and-swap idiom?
中详细介绍答案 1 :(得分:2)
实现这一点非常适合您。通常,您希望将其作为复制构造函数来执行,因此您只需在一个位置执行此操作。不幸的是,没有真正的魔力来避免告诉计算机如何复制你的结构。
当然,这仅适用于您的结构与已经编写的内容完全不同的情况。你给出的那个看起来像一个字符串或(可能)向量的很多。除非你真的需要实现新的东西,否则你可能最好只使用已经提供的那些。
答案 2 :(得分:2)
应该实现复制构造函数和赋值运算符(以上述方式)。然而,可以辅助该过程的技术是在复制指针数据时使用解引用算子(*)。这将复制指针数据而不是内存位置。如果你做ptr1 = ptr2
它只是将ptr1的内存位置设置为ptr2,这就是我们取消引用的原因。
例如,我将展示一个复制构造函数的快速示例:
GetResultStructure(const GetResultStructure& other)
: length(other.length), ptr(new char[length]) // <--- VERY _important_ - initialization of pointer
{
// Alternatively, put your initialization here like so:
// ptr = new char[length];
for(int i=0;i<length;++i)
{
ptr[i] = new char;
*ptr[i] = *other.ptr[i]; // Copy the values - not the memory locations
}
}
然后显然要确保在析构函数中清理以防止内存泄漏。
的问候,
丹尼斯M。
答案 3 :(得分:1)
GetResultStructure doCopy(GetResultStructure const& copy) {
GetResultStructure newstruct;
newstruct.length = copy.length;
newstruct.ptr = new char[newstruct.length];
memcpy(newstruct.ptr, copy.ptr, newstruct.length*sizeof(char));
return newstruct;
}
应该很简单。是的,sizeof(char)并不是必需的,但它可以显示如何处理其他数据类型。
答案 4 :(得分:1)
因为您将其标记为C ++:写一个copy constructor和一个assignment operator, 在其中实现深层复制代码:
struct GetResultStructure
{
GetResultStructure(const GetResultStructure& other)
{
// Deep copy code in here
}
GetResultStructure& operator=(const GetResultStructure& other)
{
if (this != &other) {
// Deep copy code in here
}
return *this
}
int length;
char* ptr;
};