复制数组

时间:2014-04-12 14:01:58

标签: c++ arrays pointers copy

我正在尝试复制数组。

class Myobject 
{
  int nb; 
  string name; 
  Myobject* next;
  Myobject(int nb, string name) {this->name=name; this->nb=nb; this->next=NULL;}
};

Myobject **array;
array= new Myobject*[100];

如何制作Myobject **的深层副本,从而能够修改其中一个实例。

3 个答案:

答案 0 :(得分:0)

您可以添加此(深层)-copy构造函数:

Myobject(const Myobject& rhs) :
    nb(rhs.nb),
    name(rhs.name),
    next(rhs.next == NULL ? NULL : new Myobject(*rhs.next))
{}

您可能需要添加正确的destrutor以避免内存泄漏... 如果可能,我建议使用std::list<Myobject>代替

答案 1 :(得分:0)

分配要复制的数组和循环。

NewMyobject **newarray = new Myobject*[100];
for (int i = 0 ; i < 100; ++i)
  newarray[i] = new MyObject(array[i]);

对象必须具有复制构造函数。

答案 2 :(得分:0)

如果您想了解最新信息,请使用RAII,其中C ++非常适合。

#include <vector>
#include <memory>
#include <string>
#include <iostream>

struct Myobject : std::enable_shared_from_this< Myobject >
{
  int nb; 
  std::string name; 
  std::shared_ptr<Myobject> next;
  Myobject(int nb, std::string name) { this->name=name; this->nb=nb; }
  ~Myobject() { std::cout << "deleting " << nb << " " << name << std::endl; }
};

int main() {
    std::vector< std::shared_ptr< Myobject > > arr;
    arr.push_back(std::make_shared< Myobject >(1,"first"));
    arr.push_back(std::make_shared< Myobject >(2,"second"));

    for (auto obj: arr) {
        std::cout << obj->nb << " " << obj->name << std::endl;
    }

    arr[0]->next = arr[1];
};

outputting

1 first
2 second
deleting 1 first
deleting 2 second

并且您最初不需要太在意内存管理。没有经过适当注意的例子会产生内存泄漏。

更新:忘记提及,如果您有循环引用,请注意,您也可能使用shared_ptr来获取内存泄漏。如果是这种情况,您可以通过切换到weak_ptr s→std::weak_ptr

来避免这种情况