gpt4 book ai didi

c++ - 代码在调用 delete 时崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 16:02:34 25 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但是为什么这段代码在调用 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;
}

最佳答案

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

delete[] result;

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

线

result=temp;

对调用函数中的指针不做任何事情。调用函数仍然有一个悬空指针。

解决方案一

将参数更改为对指针的引用。

void resize (char*& result, int& size){
...
}

方案二

返回新分配的内存作为返回值。

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

在调用函数中。

方案三

而不是使用 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;
}

程序对我来说运行良好。

关于c++ - 代码在调用 delete 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40979980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com