0

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

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

    例如:

    struct SomePointerStruct
    {
         int* p_array;
    }
    

    如果我复制该结构会发生什么?还,

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

4

3 回答 3

3

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

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

于 2013-10-31T14:51:18.160 回答
1

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

不。

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

我需要清理原始指针吗?

一般来说,是的。

对于每一个new,都必须有一个匹配delete。如果您实例化 a SomePointerStruct,并且该调用的构造new,那是delete您在某处需要的——可能在SomePointerStruct's 析构函数中。如果您创建一个副本SomePointerStruct并且副本深度复制原始指针(调用new),那么delete您需要一秒钟——同样,可能在析构函数中。

于 2013-10-31T14:50:45.073 回答
1

为了避免重复你的 C++ 书中名为Memory的整章,我会这样回答:

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

结果:

struct SomePointerStruct { int x; }

可以轻松复制,并且:

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

是不可复制的(但它是可移动的)。这延伸到所有其他类型(如果它们构造正确),也许没有“琐碎”。在您的原始示例中复制指针值的事实当然会导致很多问题,但是由于使用我上面写的内容可以很容易地避免它们,因此这种简单的赋值有点超出 WRT 的范围。

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


至于创建动态数组,你最好简单地使用std::vector.

于 2013-10-31T14:52:20.220 回答