一些关于VC++开发的笔记

通常程序卡住了,主要有两方面的可能:

(1)死循环了
(2)死锁了
要确定是否是死循环,可以通过调试器(常用Windbg)查看线程运行时间,如果隔了一段会儿两次查看的运行时间有很大差别,那么很有可能是死循环了。反之,可能是死锁了,这时候可以看一下堆栈最上帧是不是在调用类似WaitForSingleObject或者WaitForMultiObject之类的函数,如果线程很多,只能逐步排查那些线程在等哪些锁。

关于容器的删除操作

vector,list,map都可以通过erase函数删除元素。erase(it++)的方式不能用于vector,vector需要通过it = erase(it)的方式删除,erase会返回被删除的最后一个元素的迭代器。
而链式结构的list和map可以使用erase(it++)方式删除,这是因为参数的++处理操作优先于函数调用,所以it会在erase之前先变成下一个迭代器,当然it = erase(it)也是可以的,两种方式等价

将计数与new出来的内存联系在一起,这就是shared_ptr的本质。

在使用的时候,不需要自己显式控制计数加减,而是通过shared_ptr内部进行计数,我们自己完全可以通过这种思路实现shared_ptr。
多线程环境下,智能指针在读的时候,可以通过判断引用计数来判断其他地方是否在占用该对象。
Copy_On_Write–Refer_On_Read:写的时候重新拷贝一份,读的时候引用一下。智能指针在写的时候,如果有人在占用这个内存,reset一下,相当于把引用计数减一,然后重新开辟一段内存区域拷贝原来的内容,在这里面进行写。读的时候,引用一次这个指针,计数加1。这样进行读占用的地方就还是使用原来的内存,而使用完毕之后,引用计数减1,会释放这段内存。这样当前使用的是以前的内存,以后真正访问的是新开辟的内存。妙!!!

文件编译时存在未声明/定义或文件未包含的情况

有时候明明感觉是包含了,检查了一遍又一遍,却还是不知道哪里问题。这时候可以加编译选项CommandLine /P,可以生成.i文件,将包含的整个文件关系显示出来。通常可能是包含顺序问题,或者define/undefine了某个宏导致的问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值