C++ 调用delete时代码崩溃
这可能是一个愚蠢的问题,但为什么调用delete时此代码会崩溃?通过阅读其他问题,我知道这可能导致未定义的行为,但我不明白确切的原因C++ 调用delete时代码崩溃,c++,crash,C++,Crash,这可能是一个愚蠢的问题,但为什么调用delete时此代码会崩溃?通过阅读其他问题,我知道这可能导致未定义的行为,但我不明白确切的原因 #include <iostream> using namespace std; char* resize (char* result, int& size){ char * temp; temp = new char [size*10]; for (int i=0;i<size;i++) temp[i]=result[i]
#include <iostream>
using namespace std;
char* resize (char* result, int& size){
char * temp;
temp = new char [size*10];
for (int i=0;i<size;i++) temp[i]=result[i];
size*=10;
//delete[] result;
return temp;
}
void transform(char in[], const char p1[], const char p2[]){
int resultlength=100, inputindex=0, outputindex=0;
char* result = new char[resultlength];
while (in[inputindex]){
result[outputindex++]=in[inputindex++];
if (inputindex>=resultlength) result = resize (result,resultlength);
}
in[outputindex--]=0;
while(outputindex>=0) in[outputindex]=result[outputindex--];
//delete[] result;
}
int main(){
char t[200]="123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345";
transform(t,"hfgh","dfsdfds");
int i=0;
while(t[i]) cout<<t[i++];
cout<<endl;
return 0;
}
#包括
使用名称空间std;
字符*调整大小(字符*结果、整数和大小){
字符*温度;
temp=新字符[大小*10];
for(int i=0;i=resultlength)result=resize(result,resultlength);
}
在[outputindex--]=0;
而[outputindex]=结果[outputindex--]中的(outputindex>=0);
//删除[]结果;
}
int main(){
字符t[200]=“12345678900123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345”;
变换(t,hfgh,dfsds);
int i=0;
虽然(t[i])不能@WhozCraig在金钱问题上的评论是正确的。问题的关键在于
delete[] result;
使调用函数中的指针成为悬空指针
线路
result=temp;
while(outputindex>=0) in[outputindex]=result[outputindex--];
对调用函数中的指针不执行任何操作。调用函数仍有一个悬空指针
解决方案1
将参数更改为指针的引用
void resize (char*& result, int& size){
...
}
解决方案2
返回新分配的内存作为返回值
char* resize (char* result, int& size){
char * temp;
temp = new char (size*10);
for (int i=0;i<size;i++) temp[i]=result[i];
size*=10;
delete[] result;
return temp;
}
在调用函数中
解决方案3
不要使用char*result
,而是使用std::string result
或std::vector result
查看MCVE后更新
线路
result=temp;
while(outputindex>=0) in[outputindex]=result[outputindex--];
导致未定义的行为。通过使用gcc-Wall
,我得到以下诊断:
socc.cc: In function ‘void transform(char*, const char*, const char*)’:
socc.cc:22:62: warning: operation on ‘outputindex’ may be undefined [-Wsequence-point]
while(outputindex>=0) in[outputindex]=result[outputindex--];
^
将其更改为:
while(outputindex>=0)
{
in[outputindex]=result[outputindex];
--outputindex;
}
这个程序对我来说运行得很好。@WhozCraig对钱的评论是正确的。问题的关键在于
delete[] result;
使调用函数中的指针成为悬空指针
线路
result=temp;
while(outputindex>=0) in[outputindex]=result[outputindex--];
对调用函数中的指针不执行任何操作。调用函数仍有一个悬空指针
解决方案1
将参数更改为指针的引用
void resize (char*& result, int& size){
...
}
解决方案2
返回新分配的内存作为返回值
char* resize (char* result, int& size){
char * temp;
temp = new char (size*10);
for (int i=0;i<size;i++) temp[i]=result[i];
size*=10;
delete[] result;
return temp;
}
在调用函数中
解决方案3
不要使用char*result
,而是使用std::string result
或std::vector result
查看MCVE后更新
线路
result=temp;
while(outputindex>=0) in[outputindex]=result[outputindex--];
导致未定义的行为。通过使用gcc-Wall
,我得到以下诊断:
socc.cc: In function ‘void transform(char*, const char*, const char*)’:
socc.cc:22:62: warning: operation on ‘outputindex’ may be undefined [-Wsequence-point]
while(outputindex>=0) in[outputindex]=result[outputindex--];
^
将其更改为:
while(outputindex>=0)
{
in[outputindex]=result[outputindex];
--outputindex;
}
这个程序对我来说运行得很好
结果可能为空,请确保在函数顶部进行检查
您正在执行的操作是在resize中删除结果。但由于指针不是通过引用传递的,因此resize函数外部的结果指针指向已删除的内存。因此,请通过引用传递指针或将其更改为
然后你会打电话给我
resize(&result,resultlength)
编辑:
若要更改调整大小以通过引用获取指针,请将声明更改为
resize(char*& result,...)
这就是它,比指针指向指针的方法简单得多
结果可能为空,请确保在函数顶部进行检查
您正在执行的操作是在resize中删除结果。但由于指针不是通过引用传递的,因此resize函数外部的结果指针指向已删除的内存。因此,请通过引用传递指针或将其更改为
然后你会打电话给我
resize(&result,resultlength)
编辑:
若要更改调整大小以通过引用获取指针,请将声明更改为
resize(char*& result,...)
也就是说,指针指向指针的方法要简单得多。result=temp
对函数的调用方来说毫无意义。通过引用传递该指针,或者利用函数的其他未使用的返回值。这个问题有数百个重复项,但标题、描述和内容对它来说非常不同要锁定一个可能很有挑战性。我已经更改,所以它会将引用传递到指针,但在到达“删除”时仍会崩溃。我现在感觉很愚蠢,但是的,打字错误是一个问题(除了其他错误)。谢谢。result=temp
对函数的调用者来说没有任何意义。通过引用传递该指针,或者利用函数的其他未使用的返回值。这个问题有数百个重复项,但标题、描述和内容差异太大,很难确定其中一个。我已经更改了,所以无法确定ses指向指针的引用,在到达delete时仍然会崩溃。我现在觉得很愚蠢,但是是的,打字错误是一个问题(除了其他错误)。谢谢。使用std::vector
FFS。我本来希望这样,你是对的,但我的代码中没有再出现一个错误吗?因为我尝试了这两种解决方案,但代码仍然在删除时崩溃…@user3019593,你需要发布一篇文章,这样我们就可以看到你看到的内容。我编辑了我的文章以添加main。基本上,这就是我的全部代码此刻。好的,正如阿维·伯杰指出的,有一个输入错误。你也错过了:)案例结束了,非常感谢。使用std::vector
FFS。我期待这样的东西,你是对的,但是我的代码中没有更多的错误吗?因为我已经尝试了这两种解决方案,代码仍然在删除时崩溃…@user3019593,你是对的吗我们可以在邮件中看到一个字母。我已经编辑了我的文章来添加main。基本上这就是我现在的全部代码。好的,正如Avi Berger指出的,有一个打印错误。你也错过了:)Cox关闭了,非常感谢。在C++中,传递指向指针的引用是首选的习惯用法。在C++中,向指针传递引用是首选的成语。