【问题标题】:Resizing dynamically allocated pointer array to class将动态分配的指针数组调整为类
【发布时间】:2017-01-19 02:44:48
【问题描述】:

如何在不使用向量的情况下调整数组的大小? 我要调整大小的数组是指向类的指针

class A
{
    private:
    B * b;
    int numOfItems;
    int maxNumOfItems;

    public:
    A();
    ~A();
    resizeMX();
};


A::A()
{
     numOfItems = 0;
     maxNumOfItems = 20;
     b = new B[maxNumOfItems];
     for(int i=0;i<maxNumOfItems ;i++)
     {
         b[i] = 0;
     }
}

A::~A()
{
    for(int i=0;i<numOfItems;i++)
     {
         delete [] b;
     }
}

void A::resizeMX(const B & obj)
{
     bool value=false;
     if(numOfItems<=maxNumOfItems && value == false)
     {
        //assign values to *b in for loop
     }
     else
     {
       //resize index of *b 

我知道我们应该动态分配新内存。像这样?

       ++maxNumOfItems; 
        b=new B[maxNumOfItems];
        //keep previous assigned values and add new values at the end
        for(int j=numOfItems;j<maxNumOfItems;j++)
        {
            //assign values to b[j]
        }
     }  
        numOfItems++;
}

假设我确实重载了 = 运算符

【问题讨论】:

  • 你是~A() 应该只调用一次删除。 delete [] b;

标签: c++ class dynamic-memory-allocation


【解决方案1】:

你不能调整数组的大小,你只能分配一个新的(更大的)并复制旧数组的内容。如果您不想使用 std::vector(出于某种原因),这里是它的代码:

int size = 10;
int* arr = new int[size];

void resize() {
    size_t newSize = size * 2;
    int* newArr = new int[newSize];

    memcpy( newArr, arr, size * sizeof(int) );

    size = newSize;
    delete [] arr;
    arr = newArr;
}

【讨论】:

  • 对 C++ 对象使用memcpy 通常不是一个好主意。而是使用例如std::copy 或手动循环并移动对象。
  • 不过,它从来没有对我造成任何错误。我想这取决于偏好和经验。我仍然会研究 std::copy,谢谢 :) @JoachimPileborg
  • 对于像int 这样的基本类型,memcpy() 可以正常工作。对于 OP 要求的类类型,它(通常)给出未定义的行为。
  • 使用memcpy 比使用realloc 有什么优势?
【解决方案2】:

当您重新分配 b = new B[...] 时,您会丢失原始指针,从而丢失所有先前的对象。

相反,您需要为新内存使用临时变量,并将copy(或移动)从旧的b 移动到新内存。然后你删除旧内存并重新分配指针,

【讨论】:

    【解决方案3】:

    首先,数组不是指针。指针可以包含数组的第一个元素的地址,它可能是动态分配的,也可能不是动态分配的。

    无论如何,假设您有一个指向动态分配数组的指针B

    pointer = new B[size];   //  assume size > 0
    
      //  optionally do something with the elements of pointer other than resizing
    

    那么,要调整大小就需要动态分配一个新数组

    B *new_pointer = new B[newsize];    // assume size < newsize
    

    然后将元素复制到新数组中

    for (i = 0; i < size; ++i)
          new_pointer[i] = pointer[i];     // relies on B's assignment operator
    

    然后释放旧的动态分配的数组

    delete [] pointer;
    

    最后,重新分配 pointer 以指向新分配的数组。

    pointer = new_pointer;
    

    最好使用标准容器,因为它可以根据需要管理所有分配和重新分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2013-05-26
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多