如何在动态二维数组中从初始长度释放不同长度的单元格?

时间:2013-11-19 05:14:02

标签: c++ arrays memory dynamic delete-operator

我正在尝试将名称读入20行的2d动态数组中,并且名称的长度不受限制。由于引入了超过初始值10的新长度,程序在最后崩溃时出现“堆损坏”错误。但是,遇到的唯一问题是当我运行循环以删除上述单元格时。有谁知道如何删除长度不同于初始值的单元格? (特别是在这种情况下。)我是否需要使数组中的所有单元格成为新的长度?附:我不能使用向量,因为这是一项禁止它们的家庭作业。

确定。这是@RetiredNinja建议更改的更新版本。它运行得很好,我在以前测试的任何条件下都不会出现“堆损坏”错误。

#include <iostream>

using namespace std;

#include <memory.h>
#include <string.h>                             // will be used once I write the sort and search functions

char * ReadString();

void main ()
{
bool contMain=true;
const long numNames=20;
long nameAc=0;
char ** ppNames, c;
ppNames=new char* [numNames];
char test;

while(contMain && nameAc<numNames)
{
    ppNames[nameAc]=ReadString();
    test=ppNames[nameAc][0];
    if(test=='\0')
    {
        contMain=false;
        break;
    }
    else;
    nameAc++;
}
for(int i=0; i<nameAc; i++)
    cout<<ppNames[i]<<endl;

// deallocation
for(int i=0; i<nameAc; i++)
{
    cout<<i<<endl;
    delete ppNames [i];
}
delete[] ppNames;
}


char * ReadString()
{
long aSize=10;
long numChars (0);
char * pNames;
char * pTemp;
char c;
pNames=new char [aSize+1];

while((c = cin.get()) != '\n')
    {
        if(numChars >= aSize)
        {
            aSize *= 2;
            pTemp = new char[aSize + 1];
            memcpy(pTemp, pNames, numChars);
            delete[] pNames;
            pNames = pTemp;
            cout << "Array size increased to " << aSize << endl;
        }
        pNames[numChars++] = c;
    }
    pNames[numChars] = '\0'; //end of string
    return pNames;
}

1 个答案:

答案 0 :(得分:0)

你的大部分代码都没有多大意义。你分配和删除相当随意地经常撤消你之前几行所做的事情。

尝试这样的事情:

char * ReadString()
{
    long aSize = 10;
    long numChars = 0;
    char * pNames;
    char * pTemp;
    char c;
    pNames = new char[aSize + 1];

    while((c = cin.get()) != '\n')
    {
        if(numChars >= aSize)
        {
            aSize *= 2;
            pTemp = new char[aSize + 1];
            memcpy(pTemp, pNames, numChars);
            delete[] pNames;
            pNames = pTemp;
            cout << "Array size increased to " << aSize << endl;
        }
        pNames[numChars++] = c;
    }
    pNames[numChars] = '\0';//end of string
    return pNames;
}