【问题标题】:Pointer assignments in a copy constructor复制构造函数中的指针赋值
【发布时间】:2017-07-09 10:30:25
【问题描述】:

我正在使用 Avinash C. KAK 撰写的对象编程一书,在第 452 页中,它说将复制构造函数方法构造为

class X{
int * ptr;
int size;
public:
X(const X & xobj)
{
    size = xobj.size;
    ptr = new int [size];
    for(int i = 0; i < size; i++)
    {
        ptr[i] = xobj.ptr[i];
    }   
}
}

然后它用作

X x1;
X x2 = x1;

但是我不明白的是,它先是给x2.ptr分配内存,然后再把x1.ptr的内存地址分配给x2.ptr,这和有拷贝构造方法的目的和新分配的有矛盾内存现在根本没有被使用,所以我错过了什么?

【问题讨论】:

  • 为什么觉得内存没有用?从ptrptr没有赋值,只有内容被复制
  • 但是我们不应该使用 as ´´*obj.ptr[i]´ 吗?
  • 不,不应该。这是一个正常的数组访问。
  • @SamiKuhmonen 所以这样做的方式是正式的和正确的方式吗?
  • 是的。它分配一个新数组并将现有对象的内容复制到其中,因此现在有两个相同的对象彼此污水。

标签: c++ class c++11 memory-management


【解决方案1】:

如果你有一个指向新分配的数组的指针,例如:

ptr = new int[size];

那么你可以像数组一样索引它:

ptr[1] = 3; // equivalent to: *(ptr + 1) = 3

因此,由于它是一个复制构造函数,它将xobj.ptr 指向的内存内容复制到ptr 指向的新分配的内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2016-09-13
    • 2010-10-21
    • 2016-04-13
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多