如何使用指向内部数据的指针复制结构(以便复制指向它们的指针和数据)?

时间:2011-01-31 06:05:56

标签: c++ memory data-structures boost

所以我有一个类似

的结构
struct GetResultStructure
{
  int length;
  char* ptr;
};

我需要一种方法来制作它的完整副本,这意味着我需要一个副本,以便在原始结构中具有新ptr指向的数据副本。有可能吗?我的意思是我拥有的任何包含ptrs的结构都会有一些字段的长度我需要一个函数来复制我的结构,通过给定的长度数组来处理它们所指向的所有ptrs和数据......有什么很酷的增强函数吗?或者以任何方式创建这样的功能?

5 个答案:

答案 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;
};