Статические функции, встраивание и шаблоны? - PullRequest
1 голос
/ 09 февраля 2010

У меня есть шаблон класса со статической функцией (см. Функцию Connect ниже). Этот шаблонный класс является частью сторонней библиотеки (назовите ее LibA). Мой код использует эту библиотеку и включает в себя заголовок ниже, так как мне нужно использовать класс шаблона. Когда я компилирую свою библиотеку без встроенных функций (-fno-default-inline с gcc), у меня не возникает проблем. Когда я компилирую в выпуске (-O2), мое приложение вылетает.

Мне было интересно, что означает наличие статической функции в шаблоне и как встраивание может повлиять на это.

template<class T>
class TCPConnector
: public IOHandler {
private:
    string _ip;
    uint16_t _port;
    vector<uint32_t> _protocolChain;
    bool _closeSocket;
    Variant _customParameters;
public:

TCPConnector(int32_t fd, string ip, uint16_t port,
        vector<uint32_t>& protocolChain, const Variant& customParameters)
: IOHandler(fd, IOHT_TCP_CONNECTOR) {
    _ip = ip;
    _port = port;
    _protocolChain = protocolChain;
    _closeSocket = true;
    _customParameters = customParameters;
}

virtual ~TCPConnector() {
    //FINEST("Close socket: %d", _closeSocket);
    if (_closeSocket) {
        close(_fd);
        //FINEST("Socket closed!");
    }
}


static bool Connect(string ip, uint16_t port,
        vector<uint32_t>& protocolChain, Variant& customParameters) {

    protoent *pProtocol = getprotobyname("IP");
    if (pProtocol == NULL) {
        FATAL("Unable to resolve protocol number for IP");
        return 0;
    }

    int32_t fd = (int32_t) socket(PF_INET, SOCK_STREAM, pProtocol->p_proto);
    if (fd <= 0) {
        FATAL("Unable to create fd");
        return 0;
    }

    if (!SetFdNonBlock(fd)) {
        FATAL("Unable to put socket in non-blocking mode");
        return false;
    }

    TCPConnector<T> *pTCPConnector = new TCPConnector(fd, ip, port,
            protocolChain, customParameters);

    if (!pTCPConnector->Connect()) {
        IOHandlerManager::EnqueueForDelete(pTCPConnector);
        FATAL("Unable to connect");
        return false;
    }

    return true;
}

};

Ответы [ 4 ]

1 голос
/ 17 февраля 2010

Я согласен с Дэвидом Альфонсо, что сбой может быть не связан с тем, что вы используете эту «библиотеку».

Также эта «библиотека» содержит несколько проблем, не связанных с падением:

  • Непонятно назначение параметра шаблона T. Он нигде не используется.
  • В методе Connect () несколько утечек памяти и ресурсов:
    • pProtocol и pTCPConnector никогда не удаляются;
    • fd никогда не закрывается, поскольку pTCPConnector не удаляется.
1 голос
/ 09 февраля 2010

Не думаю, что сбой связан с тем, что вы используете шаблоны, статику или встраивание. По крайней мере, в этом конкретном случае.

Вы должны попытаться выяснить причину сбоя, например, анализируя дамп.

1 голос
/ 10 февраля 2010

Вы намекаете, что, по вашему мнению, библиотека содержит эту функцию. Проверьте, если это так. Если это так, то это определенно ошибка.

Убедитесь, что у вас есть правильная версия заголовков для вашего библиотечного файла.

В противном случае исправление, позволяющее использовать библиотеку, вероятно, будет состоять в том, чтобы удалить определение из заголовка, чтобы оно больше не было встроенным. Это фактически сделает ее шаблонной функцией extern (не export), так что вы сможете использовать только специализацию (и) в библиотеке .o.

Что касается того, что вам интересно, статическая функция-член во многом похожа на свободную функцию. Если он встроенный, невозможно вызвать из файла библиотеки. В противном случае static по сути означает то же самое, что и extern: что в любом месте есть только одна копия.

0 голосов
/ 09 февраля 2010

Это не должно иметь значения. Статическая функция класса определяет, нужен ли вам экземпляр класса для вызова функции или нет. По сути, основное отличие нестатического метода от статического заключается в том, что первый имеет дополнительный «скрытый» функциональный параметр.

Поскольку вы испытываете сбой, определили ли вы, какая часть кода действительно вызывает сбой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...