gpt4 book ai didi

c++ - 不同的输出取决于删除

转载 作者:行者123 更新时间:2023-11-30 02:30:17 25 4
gpt4 key购买 nike

我有这个代码:

#include <iostream>
using namespace std;
char* pass(char* p){
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
p = a;
//delete [] a;
return p;
}
int main(int argc,char* argv[]){
char* p1 = new char[1000];
p1[0] = 'G';
p1[1] = 'e';
p1[2] = 'r';
p1[3] = 'y';
p1[4] = '\0';
char* p2 = p1;
cout << p2 << endl;
cout << pass(p2) << endl;
delete [] p1;
}

输出是:

Gery
Sery

但是如果我取消注释行 delete [] a我得到了这个输出:

Gery
ê§É

为什么?

最佳答案

在这个函数中

char* pass(char* p){
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
p = a;
//delete [] a;
return p;
}

参数是函数的局部变量。退出函数后它被销毁。

你可以想象这个函数和它的调用方式如下

pass(p2);

char* pass(/*char* p*/){
char* p = p2;
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
p = a;
//delete [] a;
return p;
}

如您所见,原始指针 p2 不会在函数中更改。该函数更改其声明为参数的局部变量 p

如果取消对delete语句的注释,则返回值指向的内存将被删除,返回的指针将失效。在这种情况下,程序由于声明而具有未定义的行为

cout << pass(p2) << endl;

尝试使用函数的返回值访问已删除的内存。

因此返回指向已删除内存的指针是没有意义的。

你想做的事情可以通过三种方式实现

第一个是将参数声明为引用

char* pass(char* &p){
^^^^^^^^
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
p = a;
return p;
}

然后像这样调用函数

cout << pass(p2) << endl;

第二种是将参数声明为指向指针的指针,即间接接受原始指针

char* pass(char* *p){
^^^^^^^^
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
*p = a;
^^^^^^^^
return *p;
^^^^^^^^^^
}

然后像这样调用函数

cout << pass(&p2) << endl;

最后,您可以简单地将返回值分配给原始指针。例如

char* pass(char* p){
char* a = new char[10];
a[0] = 'S';
a[1] = 'e';
a[2] = 'r';
a[3] = 'g';
a[3] = 'e';
a[3] = 'y';
a[4] = '\0';
p = a;
return p;
}

然后像这样调用函数j

cout << ( p2 = pass(p2) ) << endl;

尽管在这种情况下该参数已过时。

在任何情况下你都应该在程序结束时删除分配的内存

delete [] p2;

关于c++ - 不同的输出取决于删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38768909/

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