c++问题记录


  以下皆是个人工作当中的一得之见,或有谬误,贻笑大方,诸君见谅!

未明确的符号

  这是由于不同的第三方库中定义了相同的符号,可能是函数,也可能始数据类型,这种情况下,最好是能够确认是由哪两个或多个库冲突,确认之后,修改函数或者数据类型名称,一般而言,如果是数据类型名称冲突,比较容易解决,由于库已生成,不需要重新编译,所以我们只需要修改头文件中的数据类型名称即可,如果是函数类型,那么由于涉及到库的链接问题,那么只能修改函数名后重新编译;

lambda静态函数的误区

 void RaiseTask( )
  {
  	QtTask* progress = new QtTask(this);
  	progress->Update(0);
  	progress->Update(tr("Serach the the image and it's points..."));

  	static auto Done = [&](const QString& str){
    	progress->Done(QString(""));
   	 	progress.clear();
    	Msg(str);
  	};
  }

  上述这段代码看似没有问题,但是实际上,潜藏了一个重入性的问题:第一次函数运行时并没有问题,但是因为lambda声明为static,所以第二次进入时其捕获的QtTask的指针仍然是第一次进入时创建的,但第一次的指针指向的空间已析构,那么崩溃就变的不可避免;

关于clear函数

  clear()函数只是将容器中数据清空,但是需要考虑一种情况:当数据量较大时,clear()也将变的耗时;根据实际测试,当map函数中数据达到一千万时,清空数据需要2s,所以要慎用clear,但是对于客户端来说,两秒的阻塞已经有明显的卡顿,所以可以使用线程操作;

代码没问题,但是程序为什么会崩溃

  很多时候线程运行时,操作界面,程序莫名其妙的崩溃了,但是查了一下代码,并没有问题,于是再运行,这个时候操作又不会崩溃了,到底是什么原因会导致这种情况呢?个人认为是由于线程运行,占用电脑cpu,如果此时进行额外操作,比如操作界面,那么主线程必然会争夺cpu的使用权,电脑性能好,当然没有问题,但是如果电脑垃圾呢?这个时候可能就难以避免崩溃,解决方式是在线程中增加sleep,因为所谓线程,不过是宏观下的并行,微观下仍然是根据时间片分配轮流执行的,当线程sleep时,cpu得以喘息,外在表现就是电脑没那么卡了,因为这个时候其他操作也有执行机会,但是不得不考虑效率问题,线程中我们执行的大多都是耗时操作,比如1000万次循环,如果每次sleep 0.1ms,那么也将延迟100s,对于速度而言,是一个严重的牺牲;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值