代码在调用删除时崩溃

Code crashes on calling delete

本文关键字:崩溃 删除 调用 代码      更新时间:2023-10-16

这可能是一个愚蠢的问题,但是当调用删除时,为什么此代码崩溃?通过阅读其他问题,我知道这可能导致不确定的行为,但我不确定为什么。

#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; 
}

@whozcraig的评论正确。问题的症结在于

delete[] result;

使调用函数中的指针成为悬空的指针。

线

result=temp;

对调用功能中的指针没有任何作用。调用功能仍然有一个悬空的指针。

解决方案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;
}

并确保使用

result = resize(result, resultlength);

在调用功能中。

解决方案3

而不是使用char* result,而是使用std::string resultstd::vector<char> result

更新,在看到MCVE

之后

线

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;
}

程序对我来说很好。

  1. 结果可能为null,请确保在功能的顶部检查
  2. 您正在做的是删除调整大小的结果。但是,由于未通过引用传递指针,因此在调整大小函数之外的结果指针指向删除内存。因此,要么通过参考将指针传递,要么将其更改为
resize(char ** result,....){
   //Resize stuff
   delete result*;//Deleting the stuff pointed to by result
   result* = temp;// Assigning the pointer outside the function to temp
}

然后您将调整大小为

resize(&result,resultlength)

编辑:更改调整大小以获取指针,参考将声明更改为

resize(char*& result,...)

就是这样,更简单的指针指向指针方法。