У меня проблема с использованием stringstreams
Когда я запускаю этот код, первый printf отлично, но в какой-то момент он заражается и печатает более короткую строку.
string CJpsURI::getURIwithSipIpPort()
{
stringstream ss;
ss << "sip:" << m_ipAddr << ":" << m_portAddr;
string out = ss.str();
}
main() {
CJpsURI localIp();
localIp.setIpPort("192.168.88.1", 5060);
char *s = localIp.getURIwithSipIpPort().c_str();
printf("This is the sip port: %s", s); // this may be ok -- sip:192.168.88.1:5060
// do some stuff
printf("This is the sip port: %s", s); // wrong; -- sip:192.168.8/030/004
}
Похоже, что * s указывает на внешнюю строку в стеке, которая уничтожается. Но это не должно происходить с тех пор, как я возвращаюсь, а не ссылкой.
Но это, похоже, работает.
string CJpsURI::getURIwithSipIpPort()
{
string out = (boost::format("sip:%1%:%2%") % m_ipAddr % m_portAddr).str();
return out;
}
main() {
CJpsURI localIp();
localIp.setIpPort("192.168.1.1", 5060);
char *s = localIp.getURIwithSipIpPort().c_str();
printf("This is the sip port: %s", s); // this may be ok
// do some stuff
printf("This is the sip port: %s", s); // this will be ok too;
}
Любые идеи были бы хорошы
У вас есть две проблемы:
string CJpsURI::getURIwithSipIpPort()
{
stringstream ss;
ss << "sip:" << m_ipAddr << ":" << m_portAddr;
return ss.str();
}
char*
указывает на массив char
s. Здесь вы хотите, чтобы массив найден внутри строки, возвращаемой getURIwithSipIpPort
. Но эта память будет выпущена, как только эта строка закончится! На это ничего не висит. Так что вам действительно нужно сделать:
string s {localIp.getURIwithSipIpPort()};
Стандарт C++ гласит:
§ 6.7/2 [..] Вытекание конца функции эквивалентно возврату без значения; это приводит к неопределенному поведению в возвращающей значение функции.
Второе проблемное утверждение:
char *s = localIp.getURIwithSipIpPort().c_str();
Во-первых, преобразование из const char*
в char*
устарело. Используйте const char*
. Во-вторых, не делайте этого в первую очередь. Если вы хотите продлить срок службы временного, используйте ссылку const.
const std::string& s = localIp.getURIwithSipIpPort().c_str();
Ваша первая функция ничего не возвращает:
string CJpsURI::getURIwithSipIpPort()
{
stringstream ss;
ss << "sip:" << m_ipAddr << ":" << m_portAddr;
string out = ss.str(); // This does not get returned!
}
Попробуй это:
string CJpsURI::getURIwithSipIpPort()
{
stringstream ss;
ss << "sip:" << m_ipAddr << ":" << m_portAddr;
return ss.str(); // Now it returns something!
}