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

Posted

技术标签:

【中文标题】堆对象自然不支持复制语义【英文标题】:Heap objects don’t naturally support copy semantics 【发布时间】:2015-05-20 23:51:01 【问题描述】:

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

【问题讨论】:

IMO 这是一句废话,应该忽略 【参考方案1】:
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;
      
;

【讨论】:

谢谢,我明白了,这是shallow copydeep copy 之间的区别,但你能帮我理解与Java 的比较吗?

以上是关于堆对象自然不支持复制语义的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit fetchRecordChangesOperation 给出“AppDefaultZone 不支持同步语义”

自然语言语义相似度计算方法

使用 TensorRT 部署语义分割网络(U-Net)(不支持上采样)

为什么像Java,C#和VB.NET现代面向对象的语言不支持多重继承[复制]

漏洞!源单元“_BuildScript_”中的“语义分析”阶段异常 Apple Arm 上不支持的类文件主要版本 61

我的OOP学习笔记值与引用语义类型