首页 > 解决方案 > 创建 std::strings 的二维数组的最佳实践

问题描述

我是 C++ 新手,正在学习如何声明、使用和删除 std::string 的二维数组。

因为这是一个学习练习,所以我忽略了使用向量的想法(现在)。

我编写了一个程序,它创建一个小的二维数组,添加数据,然后删除二维数组,尝试在此过程中使用最佳实践。

有人可以提出改进建议吗?我最关心的是在使用完二维数组后清理它,这样我就可以避免内存泄漏的可能性。

提前致谢。

#include <iostream>
#include <string>

using namespace std;

void DIM(std::string **marray,unsigned int row,unsigned long cols)
{
    if (marray[row] != nullptr) {
        delete [] marray[row];
        marray[row] = nullptr;
    }
    marray[row] = new std::string[cols];
}

void DIM_DELETE (std::string **marray,unsigned int row)
{
    if (*&marray[row] != nullptr) {
        delete[] marray[row];
        marray[row] = nullptr;
    }
}

void DIM_DELETE_ALL (std::string **marray,unsigned int rows)
{

    for (int i=(rows-1); i>-1; i--) {
        if (marray[i] != nullptr) {
            delete[] marray[i];
            marray[i] = nullptr;
        }
    }//next i
//now take care of marray
    if (marray != nullptr) {
        delete [] marray;
        marray = nullptr;
    }
}

std::string **create2darray(unsigned int rows,unsigned int cols)
{
//first create the pointer
    std::string **my = nullptr; //create pointer , note: no data portion assigned yet

//now assign a data portion to the pointer (could do above in one step)
    my = new std::string*[rows];// elements 0 through rows-1 //assigns data section (an array of std::strings)

//now set newly created rows to nullptr
    for (unsigned int i = 0; i<rows; i++) {
        my[i] = nullptr;
    }

//dim each row for cols columns
    for (unsigned int i = 0; i<rows; i++) {
        DIM(my,i,cols);//dims the strings (creates data portion) my = new std::string*[x];//
    }

    return my;//returning a std::string **
}

int main()
{

    unsigned int rows = 3;//3 rows (0 through 2)
    unsigned int cols = 4;//4 columns (0 through 3)

    std::string **myarray = create2darray(rows,cols);//2d array (3 rows, 5 cols)
    cout << "2d array created" << endl << endl;
    myarray[0][0] = "a0"; //row 0, col 0
    myarray[1][0] = "b0"; //row 1, col 0
    myarray[2][0] = "c0";
    myarray[0][1] = "a1";
    myarray[0][2] = "a2";
    myarray[0][3] = "a3";
    myarray[1][1] = "b1";
    myarray[1][2] = "b2";
    myarray[1][3] = "b3";
    myarray[2][1] = "c1";
    myarray[2][2] = "c2";
    myarray[2][3] = "c3";
    cout << "assigned data to rows 0 to 2 and cols 0 to 3" << endl << endl;
    for (unsigned int i=0; i<rows; i++) {
        cout << i << ",0: " << myarray[i][0] << " " << i << ",1: " << myarray[i][1] << " " << i << ",2: " << myarray[i][2] <<  " " << i << ",3: " << myarray[i][3] << endl;
    }
    cout << endl;
    cout << "we are done with 2d array, let's delete it" << endl;
//tested dim_delete (seems to work)
    /*
    DIM_DELETE(myarray,0);//delete [] myarray[0]; myarray[0] = nullptr;
    DIM_DELETE(myarray,1);
    DIM_DELETE(myarray,2);
    //still need to delete myarray
    delete [] myarray;
    myarray = nullptr;
    */

//delete all rows and delete the std::string that holds the rows
    DIM_DELETE_ALL(myarray,rows);
    cout << "array deleted, all done" << endl;

//hold cursor so user can see console messages
    do {} while(cin.get()!='\n');
    return 0;

}

标签: c++multidimensional-array

解决方案


如果您的数组的第二维是恒定的,我认为您可以使用单个 new 和 delete 运算符。像这样的东西:

#include <stdio.h>
#include <string>

int ROWS = 3;
const int COLS = 4;

typedef std::string arr4[COLS];

int main()
{
        arr4 *a;

        a = new arr4[ROWS];

        for (int i = 0; i < ROWS; i++)
          for (int j = 0; j < COLS; j++)
            a[i][j] =  std::to_string(j*ROWS + i);

        for (int i = 0; i < ROWS; i++)
        {
          for (int j = 0; j < COLS; j++)
             printf("%s ", a[i][j].c_str());
          printf("\n");
        }
        printf("\n");

        delete [] a;
}

推荐阅读