免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2923 | 回复: 3
打印 上一主题 下一主题

关于QT库中c++的用法带来的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-26 18:17 |只看该作者 |倒序浏览
我在看QT4.5.2的代码中,看到以下代码
在/src/network/socket/qtcpserver.cpp第273行:

  1. static const QNetworkProxy &proxy = *(QNetworkProxy *)0;
  2. d->socketEngine = QAbstractSocketEngine::createSocketEngine(QAbstractSocket::TcpSocket, proxy, this);
复制代码
QAbstractSocketEngine::createSocketEngine 在/src/network/socket/qabstractsocketengine.cpp的第96行

  1. QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(QAbstractSocket::SocketType socketType, const QNetworkProxy &proxy, QObject *parent)
  2. {
  3.     // proxy type must have been resolved by now
  4.     if (proxy.type() == QNetworkProxy::DefaultProxy)
  5.         return 0;
复制代码
proxy.type()实现在/src/network/kernel/qnetworkproxy.cpp的第514行:
  1. QNetworkProxy::ProxyType QNetworkProxy::type() const
  2. {
  3.     return d ? d->type : DefaultProxy;
  4. }
复制代码
d为proxy的一个私有成员,在/src/network/kernel/qnetworkproxy.h的第176行
  1. private:
  2.     QSharedDataPointer<QNetworkProxyPrivate> d;
复制代码
QSharedDataPointer就把他看成是boost库中的智能指针吧.


当我看到static const QNetworkProxy &proxy = *(QNetworkProxy *)0;我还奇怪了,去地址为0不是明显出错嘛,
后来发现如果调用的函数不使用该类的成员就没有问题, 调用的函数使用了改类的成员的时候,就会报地址访问错误了.

那么QT在proxy.type()中不是访问了变量d吗, 为什么就没有错呢?

论坛徽章:
0
2 [报告]
发表于 2010-04-26 19:07 |只看该作者
临时对象?

论坛徽章:
0
3 [报告]
发表于 2010-04-27 09:55 |只看该作者
你贴的代码是不完整的,关键是QT通过编译开关选项来决定是否添加“网络代理”这个功能。

  1. #ifdef QT_NO_NETWORKPROXY
  2.     static const QNetworkProxy &proxy = *(QNetworkProxy *)0;
  3. #else
  4.     QNetworkProxy proxy = d->resolveProxy(address, port);
  5. #endif
复制代码
除非你强制关闭QT_NO_NETWORKPROXY,并重新编译Qt库。否则,正常的情况是支持网络代理的。
所以,你说的这句话并不会运行。 这也就是为什么没有出错的原因。

当然,至于如果真的运行这句话,后面的type访问会不会,我就不确定了,毕竟我只看到代码的某一部分。
如果单纯的这么用,我觉得是会出现问题的。

论坛徽章:
0
4 [报告]
发表于 2010-04-30 09:42 |只看该作者
回复 3# winterTTr


    我就是想看看不用网络代理的情况下, QT代码库是怎么运行的. 呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP