LINUX.ORG.RU

Проблема с конструтором std::string и const char*


0

0

Просто скажите мне почему вот это работает:
std::auto_ptr<Socket> Socket::accept()
{
int socketId;
sockaddr_in addr;
socklen_t addrLen;
int portAddr;
char ipBuf[INET_ADDRSTRLEN];

socketId = ::accept(socketDesk, (sockaddr*)&addr, &addrLen);
const char *ipTemp = inet_ntop(AF_INET, &(addr.sin_addr), ipBuf, sizeof(ipBuf));

std::string *ipHell = new std::string(ipTemp);
std::string ip = *ipHell;

portAddr = addr.sin_port;
delete ipHell;
return std::auto_ptr<Socket>(new Socket(socketId, addr, addrLen, portAddr, ip));
}
- то есть если пробуем посмотреть ip, то там правильный адрес.
А если делаем следующим образом, то нет?

std::auto_ptr<Socket> Socket::accept()
{
int socketId;
sockaddr_in addr;
socklen_t addrLen;
int portAddr;
char ipBuf[INET_ADDRSTRLEN];

socketId = ::accept(socketDesk, (sockaddr*)&addr, &addrLen);

std::string ip(inet_ntop(AF_INET, &(addr.sin_addr), ipBuf, sizeof(ipBuf)));

portAddr = addr.sin_port;
return std::auto_ptr<Socket>(new Socket(socketId, addr, addrLen, portAddr, ip));
}
Здесть вместо ip адерса пишеться какая-то чушь?
А вообще все еще круче. Чушь лезет даже при таком раскладе:
std::auto_ptr<Socket> Socket::accept()
{
int socketId;
sockaddr_in addr;
socklen_t addrLen;
int portAddr;
char ipBuf[INET_ADDRSTRLEN];

socketId = ::accept(socketDesk, (sockaddr*)&addr, &addrLen);

const char *ipTemp = inet_ntop(AF_INET, &(addr.sin_addr), ipBuf, sizeof(ipBuf)));
std::string ip(ipTemp);

portAddr = addr.sin_port;
return std::auto_ptr<Socket>(new Socket(socketId, addr, addrLen, portAddr, ip));
}

★★

Не уверен, что проблема вызвана именно этим, но возвращать из функции std::auto_ptr нельзя, потому что его нельзя копировать (std::auto_ptr НЕ имеет счётчика ссылок). Сколько раз реально он скопируется при возврате из функции зависит от компилятора и оптимизаций, поэтому последствия будут "плавающие". Копирование std::auto_ptr приводит к тому, что деструктор содержимого вызывается несколько раз, что уже вызывает неопределённое поведение.

GPFault ★★
()
Ответ на: комментарий от anonymous

Группа товарищей была очень огорчена количеством фич, невключённых в предыдущий стандарт C++.

mv ★★★★★
()
Ответ на: комментарий от mv

> Группа товарищей была очень огорчена количеством фич, невключённых в предыдущий стандарт C++.

Насколько я знаю, std::tr1::shared_ptr - это то же самое, что и boost::shared_ptr, только не нужно ставить boost (достаточно свежей libstdc++). Оно из буста собственно и появилось. Я это имел в виду... :)

anonymous
()
Ответ на: комментарий от anonymous

Я в курсе, что половина буста в tr :) Хотел сказать, далеко не факт, что оно из tr в std попадёт.

mv ★★★★★
()
Ответ на: комментарий от Reset

> А потом при переносе на другую платформу будет веселье :)

Не дождетесь... достаточно -I$(BOOST_DIR)/boost/tr1/

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.