堆对象自然不支持复制语义

时间:2015-03-18 09:11:32

标签: c++ copy heap semantics

在C ++中,堆对象自然不支持复制语义的含义是什么?我在阅读CPP FAQ https://isocpp.org/wiki/faq/csharp-java#universal-object时发现了这一点,但无法理解C ++的含义和适用性。

1 个答案:

答案 0 :(得分:2)

int a = 10;
int b = a;

在上述情况中,a的值会复制到b。但请考虑一下,

int* c = new int(10);
int* d = c;

在这种情况下,不会复制数据,但两个指针都指向同一地址 如果删除c,则d指向无效内存。为了避免这种情况, 你需要分别为d分配内存,然后复制数据。

int* c = new int(10);
int* d = new int(*c);

当你有一个有指针的类时,你应该确保定义
复制构造函数和赋值运算符,然后处理类似于我在下面显示的方式的数据副本。

例如,

class A
{
    private:
     int* m_data;

    public:

      A() : m_data(NULL) { }
      A(int x) : m_data(new int(x)) { }
      ~A() { delete m_data; }

      // Failing to provide the below 2 functions will 
      // result in shallow copy of pointers 
      // and results in double delete of pointers.
      A(const A& other) : m_data(new int(*(other.m_data)) { }
      A& operator=(const A& other)
      {
           A temp (other);
            std::swap (m_data, temp.m_data);
           return *this;
      }
};