动态指针和对象

时间:2013-10-31 14:41:50

标签: c++ pointers

我必须在学校写一份申请来完成作业。为此,我们必须创建一个动态数组。我的问题是:

  1. 如果我创建一个包含动态指针的结构并复制它,那么内存是否也会被复制?

    例如:

    struct SomePointerStruct
    {
         int* p_array;
    }
    

    如果我复制该结构会怎样?此外,

  2. 我是否需要清理原始指针?

3 个答案:

答案 0 :(得分:3)

默认情况下,c ++中的对象是逐字节复制的。这意味着将复制指针,并且您将获得指向同一数组的两个指针。

要解决此问题,您需要实施copy constructor,并且还应覆盖operator=。此外,您可能希望在完成后删除此数组,因此还要实现destructor。那就是“三个规则”。

答案 1 :(得分:1)

  

如果我创建一个包含动态指针的结构并复制它,   内存是否也被复制了?

C ++语言的大部分设计都是由法令规定的,“你不需要付出你不需要的东西。”这种方式的一种方式是,如果你想深层复制某些东西,你必须自己做。

  

我是否需要清理原始指针?

一般来说,是的。

对于每个new,必须只有一个匹配delete。如果你实例化一个SomePointerStruct,并且它的构造调用new,那么你需要一个delete - 可能在SomePointerStruct的析构函数中。如果您创建SomePointerStruct的副本并且副本深层复制原始指针(调用new),那么这是您需要的第二个delete - 可能再次,可能在析构函数中。 / p>

答案 2 :(得分:1)

为避免重复C ++书中名为 Memory 的整章,我将回答:

原始指针不应该拥有内存。

结果:

struct SomePointerStruct { int x; }

可以轻易复制,并且:

struct SomePointerStruct { std::unique_ptr<int> x; } 

是不可复制的(但它是可移动的)。这延伸到你所有其他类型(如果它们是正确构造的),也许是“平凡的”。指针值将在原始示例中复制的事实当然会导致很多问题,但由于使用我上面所写的内容可以很容易地避免这些问题,因此WRT的这种简单分配就属于范围。 / p>

另一件事是非拥有指针的情况,其中复制的结构当然会指向相同的内存区域。但是,您失去了指针指向有效位置的所有保证,因此首选参考。


至于创建动态数组,只需使用std::vector就可以了。