我得到一个奇怪的错误抱怨我正在假设的堆栈损坏,我调试了一下但我还没有发现问题。我似乎也无法在Visual Studio 2010中实现nothrow!
XYZ::XYZ(char * d)
{
hostname = new char[HOSTNAME_LENGTH];
ip = new char[IP_ADDR_LENGTH];
/*Dynamic Memory*/
memset(hostname, 0, HOSTNAME_LENGTH);
memset(ip, 0, IP_ADDR_LENGTH);
//strncpy(hostname, d, HOSTNAME_LENGTH);
if(dWSAStartup(MAKEWORD(2,2), &wsd) == 0) //Crashes Here!
//And so on..
dWSAStartup是从ws2_32.dll动态链接的,并且具有正确的函数参数:
typedef int (*WSAS)(WORD, LPWSADATA); //WSAStartup
不,FreeLibrary函数尚未调用 - 因此函数指针有效!
这个错误是阻止我的唯一因素!有人会给我一个指针吗?
答案 0 :(得分:1)
typedef int(* WSAS)(WORD,LPWSADATA); //调用WSAStartup
那是错的,调用约定缺失了。它默认为__cdecl,这不是在winsock2.h中声明的方式。这就是你获得运行时诊断的原因,在调用之后它会弹出堆栈中的参数,这是WSAStartup()已经完成的。结果是不平衡的堆栈。修正:
typedef int (__stdcall * WSAS)(WORD, LPWSADATA); //WSAStartup
使用的实际声明者是FAR PASCAL,网络apis在上个世纪得到了很好的保留。让你的编译器有点喜欢警告你,如果没有自动生成的调试代码,不平衡的堆栈很难诊断。