我必须在学校写一份申请来完成作业。为此,我们必须创建一个动态数组。我的问题是:
如果我创建一个包含动态指针的结构并复制它,那么内存是否也会被复制?
例如:
struct SomePointerStruct
{
int* p_array;
}
如果我复制该结构会怎样?此外,
我是否需要清理原始指针?
答案 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
就可以了。