首页 > 解决方案 > 动态分配指向对象的指针数组

问题描述

问题:

我有一堂课叫croba. 在我的控制台应用程序中,我有一个菜单,我可以在其中选择不同的选项。在我选择一个选项后,一个 switch 语句会检查我的输入并执行我选择的块。

在其中一种情况下,我希望程序动态分配指向未知大小的类对象的指针数组(要求用户输入数组的大小),问题是用户输入和数组必须被分配在“case”块中,但分配的数组必须稍后在代码中全局访问。我声明了一个指向全局对象的指针,如下所示:

croba *arrayOfObjectsPtr = NULL;

这是“案例”块:

case 3:{
            int numberOfElements;
            int indexNumber;
            if(!arrayOfObjectsPtr){
                do{
                    cout << endl << "How many linked lists? "; cin >> numberOfElements;
                }while(numberOfElements < 1);
                croba *arrayOfObjectsPtrLocal[numberOfElements];
                for (int i = 0; i < numberOfElements; i++){
                    arrayOfObjectsPtrLocal[i] = new croba;
                }
            }else{
                cout << endl << "The array is already alocated!" << endl;
            }
            arrayOfObjectsPtr = arrayOfObjectsPtrLocal;
            break;
        }

我试图弄清楚是否有一种方法可以声明一个指向全局类对象指针数组的指针,然后稍后再分配它(因为以前不知道元素的数量)。

标签: c++arraysdynamic-memory-allocationdynamic-arrays

解决方案


在 C++ 中,最好的做法是使用std::vector标准库的动态数组类。它比 C 风格的数组好用得多。在您的情况下,它看起来像这样std::vector<croba *> arrayOfObjectsPtr:不过要小心,因为您必须在销毁之前手动删除向量中的指针,如下所示:

for (auto& obj : arrayOfObjectsPtr)
    delete obj;

如果您不想像上面那样手动执行清理,请使用智能指针向量,例如std::unique_ptr.

如果您仍然想使用旧的 C 样式数组(不推荐),那么这样声明它:croba** arrayOfObjectsPtr = new croba*[numberOfElements]. 至于清理,你必须这样做:

for (int i = 0; i < numberOfElements; ++i)
    delete arrayOfObjectsPtr[i];
delete[] arrayOfObjectsPtr;

推荐阅读