静态库中的堆分配错误

时间:2011-08-15 15:59:55

标签: c++ visual-studio visual-studio-2010

我有一个可用的Visual Studio项目。

我还创建了一个包含原始项目文件(main.cpp除外)的静态库 我创建了一个“测试人员”项目(链接到它的静态库),只有原始项目中的main.cpp文件。

两者都编译没有任何相关错误。 测试人员运行得恰到好处。

但是!在测试“测试人员”时,我收到了堆分配错误(不是第一个) new []运算符在库中实现的构造函数中调用。

该行在原始项目中正常工作,没有任何错误。

代码的“小”版本:

//the staticlib
void test() {
 manager* m = new manager;
 m->open();
}
//....
class manager {
public:
open() {

        PRAWINPUTDEVICELIST lDevList;
        UINT lDevCount;
        GetRawInputDeviceList(NULL, &lDevCount, sizeof(RAWINPUTDEVICELIST));
        lDevList = (PRAWINPUTDEVICELIST) malloc(sizeof(RAWINPUTDEVICELIST)*lDevCount);
        GetRawInputDeviceList(lDevList, &lDevCount, sizeof(RAWINPUTDEVICELIST));


        if(lDevCount) {



            for(UINT i = 0; i < lDevCount; i++) {


                HIDP_CAPS mCaps;
                PHIDP_BUTTON_CAPS mButtonCaps;
                PHIDP_VALUE_CAPS mValueCaps;

                UINT size;
                GetRawInputDeviceInfo(lDevList[i].hDevice, RIDI_DEVICENAME, NULL, &size);
                char* name = new char[size+1];
            //just to be sure
            memset(name, 0, size+1);
            //surely sure
            name[size] = '\0';
                GetRawInputDeviceInfo(lDevList[i].hDevice, RIDI_DEVICENAME, name, &size);



                HANDLE lDev = CreateFile((LPCWSTR)name, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
                                     NULL, OPEN_EXISTING, 0, NULL);;

                PHIDP_PREPARSED_DATA lPrep;
                HidD_GetPreparsedData(lDev, &lPrep);
                HidP_GetCaps(lPrep, &mCaps);

                if(mCaps.NumberInputButtonCaps) {
                                    //crash is here below
                                    //mCaps.NumberInputButtonCaps ~1
                    mButtonCaps = new HIDP_BUTTON_CAPS[mCaps.NumberInputButtonCaps];
                    HidP_GetButtonCaps(HidP_Input, mButtonCaps, &mCaps.NumberInputButtonCaps, lPrep);
                }

                if(mCaps.NumberInputValueCaps) {
                                    //if the first "crash-line" is commented, then
                                    //the crash is here
                    mValueCaps = new HIDP_VALUE_CAPS[mCaps.NumberInputValueCaps];
                    HidP_GetValueCaps(HidP_Input, mValueCaps, &mCaps.NumberInputValueCaps, lPrep);
                }

                CloseHandle(lDev);      
            }


        } 
    }
};

//the app

test();

我哪里错了?这是一个典型的新手委托我不怕吗?

对不起我的英文,感谢你的时间!

2 个答案:

答案 0 :(得分:0)

添加逻辑,检查每次Win32调用的错误返回状态。可能其中一个失败了,当你解决这个问题时,其余的都会有效。 始终在使用Win32 API时检查并处理错误。

答案 1 :(得分:0)

错误是您在调用GetRawInputDeviceInfo时应该分配宽字符。从手册

  

RIDI_DEVICENAME 0x20000007   pData指向包含设备名称的字符串。

     

仅对于此uiCommand,pcbSize中的值是字符数   (不是字节数)。

换句话说,你应该写

wchar_t* name = new wchar_t[size];
GetRawInputDeviceInfo(lDevList[i].hDevice, RIDI_DEVICENAME, name, &size);

仅仅阅读手册,我没有使用此API的实际经验,但它似乎是一个可能的解释。