求助:C++ new一个类之后,类中的指针为空,怎么解决?

萌萌哒程序猴 2018-10-26 11:03:43
最近在做USB3.0控制传输,使用new实例化了类CCyUSBDevice,但是发现new之后该类中的指针,有的为空,有的不为空,这是为什么呢?

void send_control_cmd(unsigned char cmd, unsigned char *buf, LONG buflen)
{

CCyUSBDevice* ppUSB = new CCyUSBDevice;

CCyControlEndPoint *ept = ppUSB->ControlEndPt; //new之后ppUSB->ControlEndPt为空,导致下面的赋值操作出错


ept->Target = TGT_DEVICE; //不必关注,固定
ept->ReqType = REQ_VENDOR; //请求类型:自定义请求(标准请求等)
ept->Direction = DIR_TO_DEVICE; //传输方向:主机->usb设备(out)
ept->ReqCode = cmd; //自定义请求码
ept->Value = 0; //这里的设定值将传给setupdat的[2:3]位 wValue
ept->Index = 0; //这里的设定值将传给setupdat的[4:5]位 wIndex


ept->Write(buf,buflen);


delete ppUSB;

}



类CCyUSBDevice的部分定义为:

class CCyUSBDevice
{
/* The public members are accessible (i.e. corruptible) by the user of the library
* Algorithms of the class don't rely on any public members. Instead, they use the
* private members of the class for their calculations. */

public:

CCyUSBDevice(HANDLE hnd = NULL, GUID guid = CYUSBDRV_GUID, BOOL bOpen = true);
~CCyUSBDevice(void);

CCyUSBEndPoint **EndPoints; /* Shortcut to USBCfgs[CfgNum]->Interfaces[IntfcIndex]->Endpoints */
CCyUSBEndPoint *EndPointOf(UCHAR addr);

CCyUSBBOS *UsbBos;
CCyIsocEndPoint *IsocInEndPt;
CCyIsocEndPoint *IsocOutEndPt;
CCyBulkEndPoint *BulkInEndPt;
CCyBulkEndPoint *BulkOutEndPt;
CCyControlEndPoint *ControlEndPt;
CCyInterruptEndPoint *InterruptInEndPt;
CCyInterruptEndPoint *InterruptOutEndPt;

.
.
.

}


单步调试,可以看到new之后类中的BulkInEndPt、BulkOutEndPt等不为空,但是ControlEndPt为空:



麻烦大神们帮忙看看,问题出在哪里,怎么解决指针为空的问题啊,多谢多谢!



...全文
890 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
萌萌哒程序猴 2018-11-14
  • 打赏
  • 举报
回复
问题解决了,并不是用法的问题,是因为CyAPI的库版本不对,换一个版本的库就OK了。
yshuise 2018-11-04
  • 打赏
  • 举报
回复
要传参,而不是调用默认函数。因为你的句柄的默认构造函数是传的NULL。
zgl7903 2018-10-26
  • 打赏
  • 举报
回复
CYusb new 之后访问端点之前,应该先打开一个设备吧
萌萌哒程序猴 2018-10-26
  • 打赏
  • 举报
回复
像这样初始化吗?但是编译链接会出错:
杀意已决 2018-10-26
  • 打赏
  • 举报
回复
引用 2 楼 shandianfengfan 的回复:
不太明白你的意思,我是想知道为什么new之后,类的成员指针ControlEndPt还是指向空地址?



new会调用CCyUSBDevice的构造函数,在构造函数里给你需要的指针初始化
萌萌哒程序猴 2018-10-26
  • 打赏
  • 举报
回复
不太明白你的意思,我是想知道为什么new之后,类的成员指针ControlEndPt还是指向空地址?
smwhotjay 2018-10-26
  • 打赏
  • 举报
回复
CCyUSBEndPoint *EndPointOf(UCHAR addr);
是不是这个传入地址 得到usb终端? 得到 CCyUSBEndPoint * 指针
  • 打赏
  • 举报
回复
ControlEndPt只是你new出来的类里的一个指针变量,可是指针变量你并未有给它分配内存,当然为空,你需要对new出来的对象的所有指针指定内存区域后才可以使用,或者在CCyUSBDevice类的构造函数中初始化,或者在你new这个对象之后初始化,总之,指针指向内存地址才能使用

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧