我是编程的初学者,最近写了这段代码
#include<iostream>
using namespace std;
void removeAllCharacters(char * , char * );
void printArray(char*);
void deleteArrays(char*,char*);
int main()
{
char * source,*remove;
source=new char[18];
remove=new char[10];
source="Hello how are you";
remove="Hi Its me";
removeAllCharacters(source,remove);
printArray(source);
deleteArrays(source,remove);
system("pause");
return 0;
}
void removeAllCharacters(char * source, char * remove)
{
int N1=strlen(source)+1;
int N2=strlen(remove)+1;
bool arr[128] = {false};
for(int i=0;i<N2-1;i++)
{
arr[remove[i]]=1;
}
char *newSource=new char[N1];
for(int i=0,j=0;i<N1-1;i++)
{
if(arr[source[i]]==0)
{
newSource[j++]=source[i];
}
}
delete [] source;
source=newSource;
newSource=0;
}
void printArray(char* arr)
{
int N=strlen(arr)+1;
for(int i=0;i<N;i++)
{
cout << arr[i];
}
cout << endl << endl;
}
void deleteArrays(char* arr1,char*arr2)
{
delete [] arr1;
arr1=0;
delete[]arr2;
arr2=0;
}
我试过调试,发现只有那个 错误发生在delete [] source;在removeCharacters函数中。我试图在线寻找解决方案,但我找不到它。 为什么会出现这个错误?是错误,因为我已经从main分配了动态内存,但我将其从函数中删除?
答案 0 :(得分:5)
new[]
的返回值是指针值。无论发生什么情况,当您发出对delete[]
的调用时,必须使用相同的指针值。
显然这会违反上述规则:
source=new char[18];
remove=new char[10];
source="Hello how are you";
remove="Hi Its me";
您使用new[]
进行分配,但将返回值替换为字符串文字的值。换句话说,调用delete[]
所需的指针值现在已经消失。
以下是您应该做的事情的示例:
char str1[] = "Hello how are you";
char str2[] = "Hi Its me";
source=new char[sizeof(str1)];
remove=new char[sizeof(str2)];
strcpy(source, str1);
strcpy(remove, str2);
请注意,我们创建了两个使用数据初始化的缓冲区。然后我们小心地为字符分配足够的存储空间(加上终止空值),而不是计算字符数,可能会出错。
然后strcpy
函数将字符复制到另一个缓冲区。
您还有另一个错误:
source=newSource
您将立即看到返回source
时没有指定的指针。原因是source
是一个值参数,因此是函数的局部参数 - 赋值给它并不会对传递给函数的实际值做任何事情,因为任何赋值只会在一阵烟雾中上升。函数返回。
另外,你是C ++编程的初学者,你可以开始使用std::string
而不是字符串数据的char *。使用new[]
创建字符串是C ++中的一种恐龙方法。请改用std::string
。你真的应该努力不去创建像这样的字符串:
char *newSource=new char[N1];
这导致内存泄漏,有时会跟踪已分配的内存,以便delete[]
正常运行。此外,大多数(如果不是所有这些问题)都会消失。分配工作,没有内存泄漏等。
答案 1 :(得分:1)
source="Hello how are you";
remove="Hi Its me";
这是错误的。正确的方法是:
strcpy( source, "Hello how are you" );
strcpy( remove, "Hi Its me" );
您无法“删除”常量字符串。您可以删除使用“new”分配的阵列/内存。
答案 2 :(得分:-1)
源按值传递。调用delete [] source不会对main函数中的source产生任何影响。