返回指向对象的指针向量的指针后,数据会丢失
Data gets lost after returning pointer to vector of pointers to objects
这里有第一篇文章...我正在尝试让这段代码工作,它可以编译但抛出一个 seg。当我在函数返回后尝试使用指针访问数据时出错。我猜函数结束后数据被删除,因此指针丢失。我已经搜索了很多,并认为修复它的唯一方法是如果其他人可以查看我的代码并为我指出正确的方向。提前感谢很多。
/*
* Compile with:
* g++ -std=c++11 -o gsoap_pf_download_config main.cpp soapC.cpp
* soapBasicHttpBinding_USCOREIPagaFacilCobroServiceProxy.cpp -lgsoap++
*/
#include "soapBasicHttpBinding_USCOREIPagaFacilCobroServiceProxy.h"
#include "BasicHttpBinding_USCOREIPagaFacilCobroService.nsmap"
#include <string>
std::string BVserialNum = "ACF90004";
std::string BVid = "215";
std::string latitud = "0";
std::string longitud = "0";
class SoapClient {
ns2__ParametrosEnvio *parameters;
ns2__ArrayOfParametrosEnvio *parametersArray;
public:
int downloadConfig();
private:
std::string getToken(std::string date, std::string time);
std::string getProcessKey(std::string token);
int createClient(_tempuri__AperturaTerminalConsumo &client);
};
int SoapClient::createClient(_tempuri__AperturaTerminalConsumo &client) {
timeval curTime;
gettimeofday(&curTime, NULL);
std::string date = getDate(curTime);
std::string time = getTime(curTime);
std::string timeMicro = getTimeWithMicroSecs(curTime);
std::string token = getToken(date, time);
std::string processKey = getProcessKey(token);
ns2__ParametrosEnvio *arrayParam1 = new ns2__ParametrosEnvio();
ns2__ParametrosEnvio *arrayParam2 = new ns2__ParametrosEnvio();
ns2__ParametrosEnvio *arrayParam3 = new ns2__ParametrosEnvio();
ns2__ParametrosEnvio *arrayParam4 = new ns2__ParametrosEnvio();
ns2__ParametrosEnvio *arrayParam5 = new ns2__ParametrosEnvio();
ns2__ParametrosEnvio *arrayParam6 = new ns2__ParametrosEnvio();
ns2__ParametrosEnvio *arrayParam7 = new ns2__ParametrosEnvio();
std::string tokenStr = "TerminalToken";
std::string processKeyStr = "LlaveProceso";
std::string serialNumStr = "TerminalSerie";
std::string dateStr = "TerminalFecha";
std::string timeStr = "TerminalHora";
std::string latStr = "Latitud";
std::string lonStr = "Longitud";
arrayParam1->Key = &tokenStr;
arrayParam1->Data = &token;
arrayParam2->Key = &processKeyStr;
arrayParam2->Data = &processKey;
arrayParam3->Key = &serialNumStr;
arrayParam3->Data = &BVserialNum;
arrayParam4->Key = &dateStr;
arrayParam4->Data = &date;
arrayParam5->Key = &timeStr;
arrayParam5->Data = &time;
arrayParam6->Key = &latStr;
arrayParam6->Data = &latitud;
arrayParam7->Key = &lonStr;
arrayParam7->Data = &longitud;
std::vector<ns2__ParametrosEnvio* > parametersVector;
parametersVector.push_back(arrayParam1);
parametersVector.push_back(arrayParam2);
parametersVector.push_back(arrayParam3);
parametersVector.push_back(arrayParam4);
parametersVector.push_back(arrayParam5);
parametersVector.push_back(arrayParam6);
parametersVector.push_back(arrayParam7);
ns2__ArrayOfParametrosEnvio parametersArray;
parametersArray.ParametrosEnvio = parametersVector;
ns2__ParametrosEnvio parameters;
parameters.ListaDatos = ¶metersArray;
client.Parametros = ¶meters;
int i = 0;
for (std::vector<ns2__ParametrosEnvio* >::iterator it =
parametersVector.begin(); it != parametersVector.end(); ++it) {
std::cout << *it << ":"
<< *client.Parametros->ListaDatos->ParametrosEnvio.at(i)->Key << ":"
<< *client.Parametros->ListaDatos->ParametrosEnvio.at(i)->Data
<< std::endl;
++i;
}
return SOAP_OK;
}
int SoapClient::downloadConfig() {
BasicHttpBinding_USCOREIPagaFacilCobroServiceProxy service;
_tempuri__AperturaTerminalConsumo client;
_tempuri__AperturaTerminalConsumoResponse response;
createClient(client);
std::cout << *client.Parametros->ListaDatos->ParametrosEnvio.at(0)->Key << std::endl;
std::cout << *client.Parametros->ListaDatos->ParametrosEnvio.at(1)->Key << std::endl;
std::cout << *client.Parametros->ListaDatos->ParametrosEnvio.at(2)->Key << std::endl;
std::cout << *client.Parametros->ListaDatos->ParametrosEnvio.at(3)->Key << std::endl;
std::cout << *client.Parametros->ListaDatos->ParametrosEnvio.at(4)->Key << std::endl;
std::cout << *client.Parametros->ListaDatos->ParametrosEnvio.at(5)->Key << std::endl;
std::cout << *client.Parametros->ListaDatos->ParametrosEnvio.at(6)->Key << std::endl;
int ret = service.AperturaTerminalConsumo(&client, response);
if (ret == SOAP_OK) {
std::cout << "id:" << *response.AperturaTerminalConsumoResult->
TerminalConsumo->Id << std::endl;
std::cout << "locality:" << *response.AperturaTerminalConsumoResult->
TerminalConsumo->LocalidadDispositivoId << std::endl;
std::cout << "route:" << *response.AperturaTerminalConsumoResult->
Ruta->Id << std::endl;
std::cout << "fare:" << *response.AperturaTerminalConsumoResult->
Ruta->Tarifa << std::endl;
}
else
service.soap_stream_fault(std::cerr);
service.destroy(); // delete data and release memory
}
int main()
{
SoapClient client;
client.downloadConfig();
}
''
让我们看一下这些行:
ns2__ArrayOfParametrosEnvio parametersArray;
...
ns2__ParametrosEnvio parameters;
parameters.ListaDatos = ¶metersArray;
client.Parametros = ¶meters;
在这里,你声明局部变量parametersArray
和parameters
,然后保存指向这些变量的指针。
当函数返回时,这些变量超出范围,对象被破坏。已保存的指针不再指向有效对象。尝试使用它们将导致未定义的行为。
您有两种解决方案:要么不使用指针,而是复制对象(我的建议)。或者你需要用new
动态分配这些对象(并记住用delete
释放它们)。
相关文章:
- 检查输入 std::array 指针数据是否等于某个常量数组
- 指针数据类型变量如何包含对象?
- 如何在C++中使用类对象访问指针数据成员
- 如何强制实施有关指针数据成员的常量正确性
- 为什么指针>数据有效,而 *double_pointer->data 不起作用?
- 如何从C++中的原始指针数据构造张量流::张量
- 检查课程是否具有指针数据成员
- 处理类的指针数据成员的动态内存
- 在堆上启动的指针数据成员
- 具有指针数据类型的非类型函数模板参数
- 如何将复杂的指针数据作为属性放入qt-plugin-xml文件中
- C++指向函数作为参数的指针.数据类型不兼容
- 初始化指针数据结构的空间复杂性
- 运算符重载与 C++ : 具有指针数据成员的类
- 我是否需要清理非指针数据成员
- 在堆或堆栈上的指针类实例中分配C++非指针数据成员
- 函数结束后丢失指针数据
- C++ 如何确保复制构造函数不会修改原始对象的指针数据成员?
- 为什么从派生类访问基类的数据时会返回无意义的数据(我认为是指针数据)
- 将原始鼠标/指针数据转换为有意义的内容