指针的用法,求助

苦逼码农 2014-04-19 09:35:55
关于空指针的一些疑问



函数fun内部,会用到多个指针

void fun(const char* p)
{

p的检测

p2-----本地操作指针

p3--日志指针

p4----服务器相关操作指针

}

函数内部使用多个指针。


c/c++明确说明, 使用指针的时候,要检测指针。可是,如果是空指针,该如何呢?

是return 还是 assert ? 又或者其他。

举例:

p2是一个类的指针,执行某一步操作, p3 是日志指针,

如果只是生搬硬套的检测指针,可以这么写:

if(p2)
{

}

if(p3)
{

}

这种检测法子,很明显在实际开发中,根本行不通。 你想啊, 如果 项目要求用日志来记录某个操作的话,

一旦操作成功,日志指针却为空,if语句根本执行不了, 程序到时保证运行,不挂了,可是与需求违背。


所以我的写法是

if(p2&&p3)
{
操作
记录日志
}


在此基础上,如果操作完毕后,需要给服务器返回一个东西,又要用到指针,那么就在if语句内部再次检测?


于是变成:
if(p2&&p3)
{
操作
记录日志
if(p4) //可是p4为空,会怎么样? ,难道不要告诉服务器了吗?{
告诉服务器成功
}
}
还有个问题:

如果p2, p3其中一个为空,那么是否该这么写?

if(p2&&p3)
{
操作
记录日志
if(p4)
{

}

}
else
{
p4

}


我也弄晕了, 指针太多,都不知道该怎么处理逻辑了?
求助

...全文
223 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuankuan_qiao 2014-04-22
  • 打赏
  • 举报
回复
gz_qmc 2014-04-22
  • 打赏
  • 举报
回复
引用 1 楼 jerry_dqh 的回复:
不是指针把你弄乱了,跟指针无关,是你业务逻辑混了。
++++++++++++
azhou88 2014-04-22
  • 打赏
  • 举报
回复
楼主,我觉得你可以创建一个类来解决问题。
苦逼码农 2014-04-21
  • 打赏
  • 举报
回复
引用 4 楼 qq120848369 的回复:
除非指针真的可能为NULL,否则判断了干什么?
什么时候为空? 常见是: 被释放后为空(这个可以用智能指针替代), 还有单例模式,当没有new, 而getinstance返回一个空指针,使用空指针,会导致崩溃。 还有好多情况,比如,解析一个xml, 由于大小写敏感,导致查找失败,返回空指针, 如果不检查,必然导致奔溃, //////////////////////////// 日志文件这种指针,反而很少会为空, 再如获取 文件的路径,然后逆序查找\\(windows反斜杠),这些很难为空,所以很多人为了代码简洁, 干脆不检查,直接把函数作为另一个函数的参数,传入进去。 可见,导致检测指针,导致代码冗余繁琐
zideqiler 2014-04-21
  • 打赏
  • 举报
回复
本人愚见: 对于一个大一点的软件,我们总是没办法测试到所有的用户操作流程,也就是永远没办法生产出一个没有bug的软件,但有一点要记住 - 你交给用户的软件,用户的数据是最重要的,不能因为你没发现的 bug而致使其数据丢失。一个更重要的是crash是最严重的bug,我们在力求交给用户的软件是最健壮的,可信赖的,满足需求的软件,而不是让其直接crash的软件。试想不要因为我们没有发现的一个crash而导致飞机上的软件系统直接崩溃而导致机毁人亡, 而如果我们做了check,则可能有机会给出反馈,和做更多保护。 另要澄清的是:检查不能为空的指针,并不表示就是尽量避免错。请尽量不要简单误解专家的经典名言,它们都是经验的结晶,如果真的有什么心得,请贴上几句具体一点的。
赵4老师 2014-04-21
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George
zideqiler 2014-04-20
  • 打赏
  • 举报
回复
当然我们可以用异常处理(像try-catch)类似问题,但大量使用的话会明显降低运行效率。
zideqiler 2014-04-20
  • 打赏
  • 举报
回复
单从产品的功能性上来说,对于那些不能为空的指针做check确实是没有什么好处,但是个人认为我们没有办法发现所有的问题,如果我们有个预防,这样对于已发布的产品,至少能减少一些crash(毕竟crash给客户的观感是最差的,同时可能由于某个crash会把当前数据丢失)。当然assert肯定不能少的,这样有利于我们发现问题和调试。
qq120848369 2014-04-20
  • 打赏
  • 举报
回复
除非指针真的可能为NULL,否则判断了干什么?
zideqiler 2014-04-19
  • 打赏
  • 举报
回复
其实你把这个认为的太严重了,我不知道你用这些指针的具体环境,有时你即使检查了也可能没用,一个例子就是你拥有的那个指针可能在其它地方被删除了,所以你得形成良好的习惯,谁new谁就负责delete,当然你可以用智能指针就能很好的做到这点。不管怎么样,用之前还是最好要检查指针的合法性,如果对那些肯定不能为空的指针你得用assert,这样出现错误时便于你的调试。对于那些可以为空的指针你检查不为空后可以进行后续的操作。另外像你的例子,你最好把一些代码提取出来,譬如:

bool log(const char* info)
{
    assert(p3);//
    if (p3) { // check p3
        // log your
        p3->log(info);
    }
}

void fun(const char* p)
 {
    p的检测
  p2-----本地操作指针
  //p3--日志指针
  log("log some information here");
  p4----服务器相关操作指针
}
这样这个函数可以集中精力去完成它要做的事情,其它的就委托出去了,即更清晰,更易于阅读,更重要的是更易于维护。当然这不是一句两句话能说清楚的,得平时多思考,多看些相关的书籍和训练。
碼上道 2014-04-19
  • 打赏
  • 举报
回复
不是指针把你弄乱了,跟指针无关,是你业务逻辑混了。
苦逼码农 2014-04-19
  • 打赏
  • 举报
回复
引用 1 楼 jerry_dqh 的回复:
不是指针把你弄乱了,跟指针无关,是你业务逻辑混了。
那么对于这种问题,你是如何处理的,我想借鉴思路,如果你有经验,提供一些实际的,比如代码之类 太空,太抽象的思路,对我意义不大,谢谢

65,208

社区成员

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

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