代码在调用删除时崩溃
Code crashes on calling 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;
对调用功能中的指针没有任何作用。调用功能仍然有一个悬空的指针。
解决方案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 result
或std::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;
}
程序对我来说很好。
- 结果可能为null,请确保在功能的顶部检查
- 您正在做的是删除调整大小的结果。但是,由于未通过引用传递指针,因此在调整大小函数之外的结果指针指向删除内存。因此,要么通过参考将指针传递,要么将其更改为
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,...)
就是这样,更简单的指针指向指针方法。
相关文章:
- 在虚幻引擎中删除NXOpen对象时崩溃
- 无法删除EXE崩溃后,即使进程未显示在任务管理器中
- 删除SDL_PollEvent时程序崩溃
- 删除数组 c++ 崩溃问题
- 在C++中删除指针数组时析构函数崩溃
- 使用自定义上下文菜单删除 QTreeView 项崩溃
- 如果我从single_digits[*num - '0']]中删除'0',为什么这个程序会崩溃)
- 删除动态字符串时程序崩溃
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 删除关键字导致程序崩溃
- C++将自删除推回矢量时崩溃
- 为什么要删除指针崩溃wchar_t?
- 试图删除最后一个std ::向量元素时,程序会崩溃
- 当我尝试删除指针时,我的程序崩溃
- 当我递增指针然后将其删除时,为什么我的程序会崩溃
- qquickvew删除导致应用程序崩溃
- C++:指向对象的指针数组 - 删除元素时程序崩溃>
- c 从范围删除对象的操作员导致崩溃dealloceLoceLoceLoceLoceLoceLoceLoceLoceL
- libpng 的C++抽象导致 malloc 崩溃 -- 删除 2D 数组"Jagged"
- 崩溃删除[]初始化的字符串