当我们将指针从一个对象复制到同一个类的另一个对象时,我们究竟想要什么?

时间:2013-11-16 22:11:27

标签: c++ pointers copy-constructor

所以我正在阅读有关复制控制和三条规则的内容,似乎他们在使用指针作为类成员时,为什么它们是必要的主要示例。它表示如果将指针从一个对象复制到另一个对象,那么该类的多个对象将指向同一个内存。为什么这么糟糕?难道我们不希望我们指向事物的对象指向同一个东西吗?在类之间复制指针时究竟应该发生什么?我不确定在使用复制构造函数来处理指针时我们应该做些什么。

5 个答案:

答案 0 :(得分:2)

如果您有任何动态内容,则需要编写复制构造函数,以避免浅层(成员)复制。

如果不同的指针指向同一个对象,为什么会出现问题呢?因为这样,如果您更改副本,则更改原始

例如,如果您有两个指向同一对象的指针,然后使用第一个指针删除该对象 - 该对象将消失;第二个指针不会为空,而是悬空指针,其前一个但现在无效的值。

答案 1 :(得分:0)

考虑:std::vector包含指向元素数组的指针。如果您创建了一个矢量,然后复制该矢量,然后更改副本,则不希望对副本的更改也会更改原始矢量。如果将元素插入到副本中,则必须将数组释放并调整大小,原始向量现在指向释放的内存。

“三条规则”的要点是防止副本与其原件有任何残余链接。副本是独立的。这有例外(google“copy on write”),但它们也需要特殊的处理和跟踪 - 再次,在复制构造函数,赋值运算符和析构函数中。

答案 2 :(得分:0)

复制构造函数是一个工具,允许您通过复制现有对象而不是构造新对象来创建同一类的另一个对象。

如果您已经复制指针,那么它们指向内存中的同一个位置,您将创建另一个指向实际上相同对象的指针,而不是创建一个新指针。这就像在Windows中创建文件的快捷方式: - )

复制构造函数应该将对象的每个组件复制到另一个内存位置,并提供指向此位置的新指针,这样就可以创建对象的有效副本。

答案 3 :(得分:0)

如果有两个对象共享指针,那么如果对一个对象进行更改,它也会更改另一个对象。通常(但并非总是)这被认为是一件坏事。

此外,如果两个对象共享一个指针,那么你就有问题是谁负责删除指针。

实际上有一个名为std::shared_ptr的标准类,它实现了共享指针并自动为您管理内存。如果你想要一个共享指针的类,那么你应该使用这个类。这样你就不必担心三个规则。

答案 4 :(得分:0)

这很糟糕,因为当你通过指向一个对象的delete对象指针时,另一个对象中的指针将指向无效的内存。这就是为什么直接指定指针是有风险的。那是最危险的部分。但那还不是全部。如果有两个指向内存中相同位置的指针,则通过一个指针更改内存也会改变第二个指针的内容。有时它可以对您不希望改变的对象进行更改,并让您在几天内搜索错误。

回答你的第二个问题:

  

在类之间复制指针时究竟应该发生什么?

嗯......这取决于你想要什么。如果您只想指向内存中的某些内容,并且永远不会更改它或删除它,那么只需将一个指针指向另一个指针就是一个有效的想法。但是,如果你想要更改指针下的对象,首先复制它(通过new运算符和分配运算符)会更安全,然后用第二个指向新对象指针。