我有一个函数返回一个名为loop_p
的char指针,我在我的main_thread
上多次调用它,将它传递给py_embed
线程:
HANDLE handle;
SENDTOPY *cmd=new SENDTOPY();
char* msg=loop_p(ac);
char *argv[4]={"PythonPlugIn2","bridge","test_callsign",msg};
cmd->argc=4;
for(int i = 0; i < NUM_ARGUMENTS; i++ )
{
cmd->argv[i] = argv[i];
}
handle=(HANDLE) _beginthread(py_embed,0,(void*)cmd);}
其中SENDTOPY
是结构:
typedef struct{
int argc;
char *argv[4];
}SENDTOPY;
它发送给python的消息就像这样和python很好地接收它:
SENDTOPY *arg=(SENDTOPY*)data;
pArgs2=Py_BuildValue("(s)",arg->argv[4]);
pValue2 = PyObject_CallObject(pFunc, pArgs2);
为了避免出现内存分配问题,我将loop_p
函数修改为返回std::string
的函数。然后我在main_thread
中调用该字符串并做了一些修改:
...
std::string msg_python=loop_p(ac);
const char * msg2=msg_python.data();
char *argv[3]={"PythonPlugIn2","bridge","test_callsign"};
cmd->argc=3;
cmd->msg=msg2;
for(...
...
我将结构SENDTOPY
修改为:
typedef struct{
int argc;
char *argv[3];
const char* msg;
}SENDTOPY;
我将它打印到main_thread
中的文本文件中,并且修改前后的消息相同。但是在py_embed
线程中,const char不再是那个,只是一堆乱码。我做错了什么?
提前谢谢。
编辑: loop_p代码
std::string CNewDisplay::loop_p(int ac){
std::string res("Number of Aircrafts\nHour of simulation\n\n");
for (...
....
//Route
textfile<<fp.GetRoute()<<endl;
std::string route=fp.GetRoute();
std::replace(route.begin(),route.end(),' ',',');
res+=route;
res.append(",\n");
res.append("\n\n");
};
return res;
}
答案 0 :(得分:1)
在我看来,您正在存储指向堆栈上创建的临时字符串对象的内部内容的指针。如果你将字符串设为静态,那么字符串的内容在整个程序执行期间将保持有效,并且你可以安全地存储指向字符串内容的指针:
static std::string msg_python; // survives beyond local scope
msg_python=loop_p(ac); // set string to loop_p return value
const char *msg2=msg_python.c_str(); // get ptr each time since it could change
另外,请确保使用.c_str()来获取c样式的字符串指针,以确保字符串以空值终止。使用.data()不保证空终止。