动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组

Posted

技术标签:

【中文标题】动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组【英文标题】:Dynamic array C++, trouble with new Obj[size] creating only 1 Object pointer, not array 【发布时间】:2016-04-24 14:20:35 【问题描述】:

我会尽量做到这一点。不,我不能使用向量。我在 hpp 中有一个像这样声明的现有数组:

Item *itemList[4];

然后,我需要稍后创建一个新大小的 Object 指针数组。 这是我的调整大小数组函数。它不起作用,因为在设置插槽 1 之后,它会用完插槽。这是因为 Visual Studio 将 **tempList 视为指向单个对象的单个指针。我错过了什么?:

void List::resizeList(int newSiz) 
Item **tempList = new Item *[newSiz];

//Setup tempList
for (int arraySlot = 0; arraySlot < newSiz; ++arraySlot)
    tempList[arraySlot] = NULL;     

//Copy List 
for (int listSlot = 0; listSlot < numArraySlots; listSlot++)               
    tempList[listSlot] = itemList[listSlot];        


delete [] itemList; //Delete Original List
*itemList = *tempList; //Set new itemList

添加此屏幕截图以便您可以看到 Visual Studio 认为 tempList 只是一个指向单个 Item Object Pointer 的指针

enter image description here

#ifndef LIST_HPP
#define LIST_HPP

#include "Item.hpp"

class List

private:        
    Item *itemList[4]; //Array of 4 Item Object Pointers    
    int numItemsOnList; //Track number of Items on List
    int numArraySlots; //Track Array Slots available for comparison on addToList
public:
    List(); //Default 4 Objects
    void addToList(string nam, string uni, int numBuy, double uniPrice); 
    void delFromList(string itemName); //Using Name for Lookup  
    void resizeList(int newSize); //Resize new array
    void printList(); //Print current List
    double calcTotalPrice(); //Calculate Total Price of items on list
    bool itemExists(string);
;

#endif

【问题讨论】:

新建动态数组的方法是使用std::vector。你为什么不使用它? itemList2[0] = itemList[0], itemList2 是一个Item 对象数组itemList 是一个指向 Item 对象的指针数组 谢谢,但您没有阅读我的评论吗?我不能使用矢量。我们在这里谈论的不是行业标准或最佳实践。如果必须使用此方法,我需要正确的方法来执行此操作。 好的,谢谢。但是,我的 resizeList 使用 **tempList 和 newItem*[size]。创建将与 Item *itemList[4] 啮合的对象的动态指针数组的正确方法是什么? 我无法在我的电脑上复制该问题。您确定 itemList 元素在使用之前已初始化吗?还有一件事delete [] itemList; 你不需要在这里使用delete 因为这个数组不是用new 操作符创建的。 【参考方案1】:

itemList 是静态创建的数组,您不能在运行时调整它的大小。你可能想要做的是使它成为一个双指针Item** itemList,使用new在你的类的构造函数中设置它的初始大小,调整它的大小,并在类被销毁时在类的destructor处删除它.

试试这个:

List::List()

    itemList=new Item*[4];//allocate its initial size in the constructor


List::~List()

    delete[] itemList;//release the memory at the destructor


void List::resizeList(int newSiz) 
  Item **tempList = new Item *[newSiz];

  //Setup tempList
  for (int arraySlot = 0; arraySlot < newSiz; ++arraySlot)
       tempList[arraySlot] = NULL;     

  //Copy List 
  for (int listSlot = 0; listSlot < numArraySlots; listSlot++)                         
       tempList[listSlot] = itemList[listSlot];        

   delete [] itemList; //Delete Original List
   itemList = tempList; //Set new itemList

我希望这会有所帮助。

【讨论】:

谢谢!明白了。我想当先前声明的数组试图变成动态数组时会有一些麻烦......

以上是关于动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组的主要内容,如果未能解决你的问题,请参考以下文章

c++中怎样定义动态数组

C++中的动态数组声明

C++ 向数组添加元素

Mongoose更新嵌套数组

私有属性 C++ 上的动态二维数组

为啥 C++ 不支持堆栈上的动态数组? [关闭]