我的功能如下:
laodFunc(const map<uint16_t, string> & pClasses, const char * pFilePath);
我这样称呼它。这是为了使用boost
将其作为新线程运行boost::thread_group g;
stringstream myStr;
......
boost::thread *new_thread = new boost::thread(&loadFunc,classes,myStr.str().c_str());
g.add_thread(new_thread);
但是当我在被调用的方法中显示给定的路径(char *)时,我得到了错误的内容: 路径??
我想知道我在这里做错了什么。 感谢
答案 0 :(得分:3)
myStr.str().c_str()
引用的内存被立即销毁(因为std::string
返回的临时myStr.str()
被破坏),因此该线程正在取消引用悬空指针(导致未定义的行为)。
要更正,请确保提供给laodFunc()
的指针在线程的生命周期内保持有效。或者,将const char* pFilePath
更改为std::string const& pFilePath
:
loadFunc(const map<uint16_t, string> & pClasses, std::string const& pFilePath);
boost::thread *new_thread = new boost::thread(&loadFunc, classes, myStr.str());
和myStr.str()
的副本将在内部存储并传递给线程函数(请参阅Thread Constructor with arguments)。即使参数类型classes
是loadFunc()
,const&
参数也将被复制,这是值得的。如果需要,可以使用boost::cref()
:
boost::thread *new_thread = new boost::thread(&loadFunc,
boost::cref(classes),
myStr.str());
答案 1 :(得分:0)
由于myStr
是多个线程使用的全局变量(因此您获得“变量的最新设置”的值,或者使用后“消失”的局部变量,您需要执行此操作让它坚持下去并且每个线程都是唯一的东西。这里目前还不完全清楚你的目的是什么,但是一个“每线程”对象保存字符串,与线程一起创建,并在线程被销毁时被破坏会起作用。