我必须在学校写一份申请来完成作业。为此,我们必须创建一个动态数组。我的问题是:
如果我创建一个包含动态指针的结构并复制它,内存是否也会被复制?
例如:
struct SomePointerStruct { int* p_array; }
如果我复制该结构会发生什么?还,
我需要清理原始指针吗?
默认情况下,c++ 中的对象是逐字节复制的。这意味着指针将被复制,并且您将获得两个指向同一个数组的指针。
要解决此问题,您需要实现 acopy constructor
并且还应该覆盖operator=
. 此外,您可能希望在完成后删除此数组,因此还要实现一个destructor
. 那就是“三法则”。
如果我创建一个包含动态指针的结构并复制它,内存是否也会被复制?
不。
C++ 语言的大部分设计都是由法令规定的,“你不需要为你不需要的东西付费”。这种情况的一种方式是,如果你想深度复制某些东西,你必须自己做。
我需要清理原始指针吗?
一般来说,是的。
对于每一个new
,都必须有一个匹配delete
。如果您实例化 a SomePointerStruct
,并且该调用的构造new
,那是delete
您在某处需要的——可能在SomePointerStruct
's 析构函数中。如果您创建一个副本SomePointerStruct
并且副本深度复制原始指针(调用new
),那么delete
您需要一秒钟——同样,可能在析构函数中。
为了避免重复你的 C++ 书中名为Memory的整章,我会这样回答:
结果:
struct SomePointerStruct { int x; }
可以轻松复制,并且:
struct SomePointerStruct { std::unique_ptr<int> x; }
是不可复制的(但它是可移动的)。这延伸到所有其他类型(如果它们构造正确),也许没有“琐碎”。在您的原始示例中复制指针值的事实当然会导致很多问题,但是由于使用我上面写的内容可以很容易地避免它们,因此这种简单的赋值有点超出 WRT 的范围。
另一件事是非拥有指针情况,其中复制的结构当然会指向同一内存区域。但是,您失去了指向有效位置的指针的所有保证,因此首选引用。
至于创建动态数组,你最好简单地使用std::vector
.