2010-02-09 87 views
1

我有一个带有静态函数的模板类(参见下面的连接函数)。这个模板类是第三方库(称为LibA)的一部分。我的代码使用这个库,并包含下面的头,因为我需要使用模板类。当我编译我的lib没有内联函数(-fno-default-inline with gcc)时,我没有任何问题。当我在release(-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; 
} 

};

+0

什么样的崩溃发生?段错误? – wallyk 2010-02-09 20:28:19

回答

0

它应该没有关系。一个类的静态函数是关于你是否需要一个类的实例来调用函数。实际上,非静态方法和静态方法之间的主要区别在于前者具有额外的“隐藏”功能参数。

由于您遇到崩溃,您是否确定代码的哪一部分实际上导致崩溃?

+0

s/format/former/ – 2010-02-09 20:39:35

+0

@MikeDeSimone - 谢谢。 – 2010-02-09 21:16:58

1

我不认为崩溃与您使用模板,静态或内联的事实有关。至少在这种特殊情况下。

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

1

您提示您认为该库包含该功能。检查它是否。如果是这样,那肯定是一个错误。

检查您的库文件头是否有正确的版本。

如果失败了,那么可以使用该库的修复程序可能会从头中清除定义,因此它不再是内联。这将使其成为extern(而不是export)模板化函数,因此您只能在库.o中使用专门化。

至于你在想什么,一个静态成员函数与自由函数链接非常相​​似。如果它是内联的,则不能从库文件调用。否则,static基本上与extern意思相同:在任何地方只有一个副本。

1

我同意David Alfonso的意见,认为崩溃可能与您使用这个“图书馆”的事实无关。

而且这个“图书馆”包含不相关的崩溃几个问题:

  • 目前还不清楚模板参数T.它不会在任何地方使用的目的。
  • 有在连接多个存储器和资源泄漏()方法:
    • pProtocol和pTCPConnector不会被删除;
    • fd从不关闭,因为pTCPConnector未被删除。