【发布时间】:2013-11-19 05:14:01
【问题描述】:
我正在尝试将名称读入 20 行的二维动态数组,其中名称的长度不受限制。由于引入了超出初始值 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;
}
【问题讨论】:
-
函数 ReadString() 本身有很多地方需要改变。例如 pNames = new char[aSize + 1]; pNames = pTemp;这将立即导致内存泄漏。并且意图不明确。可以稍微整理一下代码再发帖吗?
标签: c++ arrays memory dynamic delete-operator