C++ 返回到对象的指针在函数返回地址后变为null
我是CPP的新手,我正在编写一个程序,作为一项任务来模拟列车路径系统,该系统包括目的地和起点,使用面向对象编程。 我有2个等级,如下所示(有一个乘客等级,但不相关):C++ 返回到对象的指针在函数返回地址后变为null,c++,c++11,gcc,C++,C++11,Gcc,我是CPP的新手,我正在编写一个程序,作为一项任务来模拟列车路径系统,该系统包括目的地和起点,使用面向对象编程。 我有2个等级,如下所示(有一个乘客等级,但不相关): 班车 { 公众: int冷却时间; 国际旅行时间; 自运动以来的整数时间; int-id; 班级站*开始; 类站*目的地; 矢量电流; 字符串状态; 无效添加列车(矢量命令、矢量车站、矢量和列车) { 行程时间=stoi(命令[第三部分+1]); 冷却时间=stoi(命令[第三部分+2]); 状态=TSTATUS1; start
班车
{
公众:
int冷却时间;
国际旅行时间;
自运动以来的整数时间;
int-id;
班级站*开始;
类站*目的地;
矢量电流;
字符串状态;
无效添加列车(矢量命令、矢量车站、矢量和列车)
{
行程时间=stoi(命令[第三部分+1]);
冷却时间=stoi(命令[第三部分+2]);
状态=TSTATUS1;
start=station\u search(stations,commands[SECOND\u PART]);//这就是问题发生的地方
目的地=站点搜索(站点、命令[第三部分]);
id=stations.size();
}
};
班级站
{
公众:
int tuffy_价格;
字符串城市名称;
矢量电流;
矢量电流;
int-id;
void add_桩号(矢量和桩号、矢量和命令)
{
tuffy_价格=stoi(命令[第三部分]);
城市名称=命令[第二部分];
id=stations.size();
}
};
我有一个搜索功能,专门用于根据用户输入的命令查找起点和终点,例如:用户输入“add_train cityname1 cityname2”。我的程序检测城市名称并搜索我用一个键命名的站点的向量,该键是城市名称,并返回指向该站点对象的指针(由于函数中内存行为的复杂性,我将其设置为指针)。
功能如下:
Station *station_search(vector<Station> stations, string key)
{
Station *dummy;
for (int i = 0; i < stations.size(); i++)
{
if (stations[i].city_name == key)
{
return &stations[i];
}
}
return dummy;
}}
站点*站点搜索(矢量站点,字符串键)
{
站*假人;
对于(int i=0;i
我的问题在于我的搜索函数的奇怪行为,当我调试程序时,我看到函数找到了正确的station对象并返回了指向它的指针,但当执行返回到构造函数时,它是随机的(可能不是随机的)将与起始站相关的第一个指针变为null,并将其中的值替换为垃圾值。
但在函数搜索目标站后,它不会这样做,并且执行是正确的
有人能解释一下为什么会发生这种错误吗?
我的猜测是,我对局部变量和指针返回的理解不够透彻,我在某个地方犯了一个新手错误,但我似乎没有找到它
PS:我没有包括完整的代码,因为它太长了,我可以通过附加一个文件来包含它,如果需要,可以进行注释。Station*Station\u search(矢量站,字符串键)
Station *station_search(vector<Station> stations, string key)
如果仔细查看此处,您将看到stations
参数通过值传递,这意味着此函数返回后,此stations
参数将被销毁。不会再有了。它将不复存在。它将成为一个ex参数
但是,此站搜索将返回指向此向量中某个值的指针。因此,逻辑规则规定它将返回指向已销毁对象的指针。试图以任何方式取消引用该指针都将成为未定义的行为
您的其他类方法通过引用接收参数,因此您必须已经了解通过值传递参数与通过引用传递参数之间的区别,因此您只需在此处执行相同的操作。Station*Station\u search(vector stations,string key)
如果仔细查看此处,您将看到stations
参数通过值传递,这意味着此函数返回后,此stations
参数将被销毁。不会再有了。它将不复存在。它将成为一个ex参数
但是,此站搜索将返回指向此向量中某个值的指针。因此,逻辑规则规定它将返回指向已销毁对象的指针。试图以任何方式取消引用该指针都将成为未定义的行为
您的其他类方法通过引用接收参数,因此您必须已经了解通过值传递参数与通过引用传递参数之间的区别,因此您只需在此处执行相同的操作。这里您传递的是向量的副本,当函数返回时,该副本将被销毁。此外,如果找不到键,则返回未初始化的指针
Station *station_search(vector<Station> stations, string key)
{
for (Station &station : stations)
{
if (stations.city_name == key)
{
// Pointer becomes invalid when you leave.
// Accessing this pointer will cause undefined behavior.
return &station;
}
}
// This would always cause undefined behavior as dummy was not initialized.
return nullptr;
}
这里传递的是向量的一个副本,当函数返回时,该副本将被销毁。此外,如果找不到键,则返回未初始化的指针
Station *station_search(vector<Station> stations, string key)
{
for (Station &station : stations)
{
if (stations.city_name == key)
{
// Pointer becomes invalid when you leave.
// Accessing this pointer will cause undefined behavior.
return &station;
}
}
// This would always cause undefined behavior as dummy was not initialized.
return nullptr;
}
OT:您应该删除dummy
,因为它从未初始化过,并返回nullptr
,这样您就可以看到何时找不到电台。可以help@SimonKraemer感谢你的提示,我来自C语言背景,不知道nullptr的语法,否则我可能会忘记它。OT:你应该删除dummy
,因为它从未初始化过,然后返回nullptr
,这样你就可以看到什么时候找不到电台了。可以help@SimonKraemer谢谢你的提示,我来自C语言背景,不知道nullptr的语法,或者我可能已经忘记了。我相信这就是解决方案,我确实理解通过引用/值传递的概念,但是我没有注意到我犯了这个错误,您还可以提到为什么函数正确返回第二个指针,但只返回第一个指针却失败了吗
Station *station_search(vector<Station> &stations, string key)