C++ 静态函数、内联和模板?

C++ 静态函数、内联和模板?,c++,gcc,C++,Gcc,我有一个带有静态函数的模板类(请参见下面的连接函数)。此模板类是第三方库(称为LibA)的一部分。我的代码使用这个库并包含下面的标题,因为我需要使用模板类。当我编译没有内联函数的lib时(-fno default inline with gcc),我不会遇到任何问题。当我在版本(-O2)中编译时,我的应用程序崩溃 我想知道在模板中使用静态函数的含义是什么,以及内联如何影响这一点 template<class T> class TCPConnector : public IOHandl

我有一个带有静态函数的模板类(请参见下面的连接函数)。此模板类是第三方库(称为LibA)的一部分。我的代码使用这个库并包含下面的标题,因为我需要使用模板类。当我编译没有内联函数的lib时(-fno default inline with 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;
}
模板
类TCP连接器
:公共IOHandler{
私人:
字符串ip;
uint16_t_端口;
向量_协议链;
bool_闭式插座;
变量参数;
公众:
TCP连接器(int32_t fd、字符串ip、uint16_t端口、,
向量和协议链、常量变量和自定义参数)
:IOHandler(fd、IOHT\U TCP\U连接器){
_ip=ip;
_端口=端口;
_原冷链=原冷链;
_closeSocket=true;
_customParameters=customParameters;
}
虚拟~TCPConnector(){
//最精细(“关闭套接字:%d”,\u closeSocket);
如果(_closeSocket){
关闭(_fd);
//最好的(“插座关闭!”);
}
}
静态布尔连接(字符串ip、uint16_t端口、,
向量和协议链、变量和自定义参数){
protoent*pProtocol=getprotobyname(“IP”);
如果(pProtocol==NULL){
致命(“无法解析IP的协议号”);
返回0;
}
int32_t fd=(int32_t)套接字(PF_INET,SOCK_STREAM,pProtocol->p_proto);
如果(fd Connect()){
IOHandlerManager::EnqueueForDelete(pTCPConnector);
致命(“无法连接”);
返回false;
}
返回true;
}

})

这不要紧。类静态函数是关于是否需要类的实例来调用函数。实际上,非静态方法和静态方法的主要区别在于前者有一个额外的“隐藏”函数参数


由于您正在经历崩溃,您是否确定了代码的哪一部分实际导致了崩溃?

我认为崩溃与您使用模板、静态或内联无关。至少在这种特殊情况下


您应该尝试找出崩溃的原因,例如通过分析转储。

您暗示您认为库包含该函数。检查是否有。如果是这样,那肯定是个错误

检查库文件的标题版本是否正确

如果不能做到这一点,那么能够使用库的修复方法可能是从标题中删除定义,使其不再内联。这将有效地使其成为
外部
(而不是
导出
)模板函数,因此您只能使用库
.o
中的专门化


至于您想知道的,静态成员函数的链接与自由函数的链接非常相似。如果是内联的,则无法从库文件调用。否则,
static
本质上与
extern
的意思相同:任何地方都只有一个副本。

我同意David Alfonso的观点,即崩溃可能与您使用此“库”无关

此外,此“库”还包含与崩溃无关的几个问题:

  • 不清楚模板参数T的用途。它没有在任何地方使用
  • Connect()方法中存在多个内存和资源泄漏:
    • 永远不会删除pProtocol和pTCPConnector
    • fd从未关闭,因为pTCPConnector未被删除

发生了什么样的碰撞?赛格断层?