C++ 调用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]

这可能是一个愚蠢的问题,但为什么调用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];
  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++中,向指针传递引用是首选的成语。