VCZH.粉丝数组[0]<errorcpp@qq.com> 16:27:19
class IRoot 没有虚析构
class Lv1 有虚析构
class Lv2
root是根,下面都是继承关系
这样有风险没?
vczh.Iskandar<vczh@163.com> 16:25:41
这样你delete IRoot
有
就不会运行析构函数
C++一切没有父类的类,只要是你打算被继承,都要由虚析构函数
董一凡(65226002) 16:26:10
让他们全部private 继承自IRoot
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:28:04
有没啥好办法
我不想在徐基类中
搞函数体实现
好丑
vczh.Iskandar<vczh@163.com> 16:26:28
private继承也没用
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:28:29
那怎么办
vczh.Iskandar<vczh@163.com> 16:26:37
说不定那个IRoot就是那个类自己给出去的
而且就算你private了
dynamic_cast也是可以用的
董一凡(65226002) 16:26:55
那无所谓了啊
vczh.Iskandar<vczh@163.com> 16:26:56
你只要在IRoot写一个空的虚析构函数就行了
别的什么都不需要干
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:29:01
但是这样如果跨模块
董一凡(65226002) 16:27:24
如果你case到了派生类,那自然就会调用正确的析构函数了
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:29:19
iroot相当于编译了两次
vczh.xyz粉(54438159) 16:27:44
vczh.Iskandar<vczh@163.com> 16:27:46
不会的
董一凡(65226002) 16:27:52
准确的说,析构函数要么是公有虚的,或者protected非虚的
vczh.Iskandar<vczh@163.com> 16:27:53
你把实现写在了cpp文件里面
就不会被编译两次了
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:30:06
那如果两个模块
同时需要iroot
董一凡(65226002) 16:28:32
只要你不用基类来delete派生类,那析构函数不需要是虚的
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:30:26
就要都加入cpp
C++的什么东西都差一点,不完美啊
VCZH.粉丝数组[5](110086478) 16:31:03
准确的说,析构函数要么是公有虚的,或者protected非虚的
effective上看到过,后一种一般什么时候用到
vczh四号粉丝(342775210) 16:31:14
加一个虚析构,又没啥
VCZH.粉丝数组[5](110086478) 16:31:49
其实可以让编译器做的
vczh.Iskandar<vczh@163.com> 16:32:06
加一个虚析构,又没啥
VCZH.粉丝数组[5](110086478) 16:32:25
只要有继承,编译器就让析够,多省心
董一凡(65226002) 16:32:42
后一种就是,你永远不能用基类指针来delete派生类
所以析构函数也就不用是虚的了
VCZH.粉丝数组[5](110086478) 16:33:11
比如?场景?看得忘了
董一凡(65226002) 16:34:29
比如你有一大组不同的接口,class A : public I1, public I2, public I3{}
你有写函数是这样子的,fun(I1* i) fun2(I2* i) fun3(I3* i)
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:37:29
当智能指针遇到这个事情
vczh.Iskandar<vczh@163.com> 16:35:33
我所有的类都继承自Object
董一凡(65226002) 16:35:36
你的fun只不过是调用几个接口,而不会管理实际对象的生命周期,那这样设计就是合理的
vczh.Iskandar<vczh@163.com> 16:35:38
所有的接口都继承自Interface
他们都有虚析构函数
我为了解决这个问题
然后就没问题了
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:38:12
嗯,想这样一个对象
作为多个接口
扩散到不同模块
偶就用shared_ptr了
老残搞不定复杂的生命周期管理
VCZH.粉丝数组[5](110086478) 16:37:00
java啊
vczh四号粉丝(342775210) 16:37:12
真的是闲的蛋疼啊
加一个虚析构,又能怎么样
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:39:29
好丑的,,,
VCZH.粉丝数组[5](110086478) 16:37:36
其实我们游戏服务器也是用一个object的
vczh四号粉丝(342775210) 16:37:43
只要碰到继承,就必须虚析构
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:40:25
比如你动态库
提供某个接口
董一凡(65226002) 16:38:38
哎,比如你的接口本本来就只是几个函数。连成员都没有,那干嘛还加个虚析构,去加一个指针大小呢
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:40:49
然后又是显示加载
董一凡(65226002) 16:38:58
尤其是编译器对这种类还能够直接优化掉
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:41:16
这样虽然那个虚析构是空的
但是实际上
exe和dll里边
都有一份实现
我理解的没错吧
我觉得这个现象
不好
vczh.xyz粉(54438159) 16:40:32
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:43:02
囧,我再去好好理解理解去
应该如果只用指针
是可以只有一份实现的
董一凡(65226002) 16:41:24
v大,你既然所有类继承自object,那你在做ui的时候,大可以模范qt了,在基类里加一个slot的概念,所有ui对象就都可以接收发过来的消息了
跨dll就千万要小心了,你别在dll里new东西,在另一个dll里delete,会出错的
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:44:22
跨dll就千万要小心了,你别在dll里new东西,在另一个dll里delete,会出错的
这个不一定出错
和运行库相关
董一凡(65226002) 16:42:57
嗯,对的,但这是一个当地晦涩的角落
一起搞明白,最好的办法是避免
ooseven(147340642) 16:43:08
我都是用heapalloc,没有这个顾虑
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:45:15
流氓
话说vs2012以后
运行库就是用heapalloc了
所以
这个问题,不是问题了
ooseven(147340642) 16:43:51
是吗?
你确定?
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:45:58
如果我没记错
好像在哪看到过
VCZH.粉丝数组[5](110086478) 16:44:19
exe和dll会各有一份?
ooseven(147340642) 16:44:43
我重载了所有的容器,传入一个自己的Allocator<_Kty>
这个Allocator<_Kty>,里面就是heapalloc
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:47:24
显示加载dll
就是说,dll的代码和exe的代码是分开的
假设exe和dll里边有相同的对象
那么他们必须都包含虚基类的完整实现
也就是说虚基类在exe和dll里边
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:48:29
分别都编译了一次
那么exe和dll里边关于虚基类的机器码
就有相同的两份
vczh四号粉丝(342775210) 16:47:28
动态链接啊,怎么会有两份代码
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:49:41
exe一份 dll一份
vczh四号粉丝(342775210) 16:47:50
除非你dll是静态链接的
然后有蛋疼的静态链接exe了一份
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:49:56
不然肯定链接错误
我们遇到过一次bug
和这个类似
就是单例模式
在exe和dll的地址
不一样
后来发现就是哪个instance
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:51:06
在exe和dll各有一份实现
VCZH.粉丝数组[5](110086478) 16:49:06
你那是export吧
不用两份代码
一份就行
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:51:28
只有一份编译都过不了
VCZH.粉丝数组[5](110086478) 16:49:37
直接export就行,单件
可以
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:51:56
那要把单利放到dll
然后隐式加载
不然这边exe链接错误
VCZH.粉丝数组[5](110086478) 16:50:20
是的
嗯
好牛逼
vczh.Iskandar<vczh@163.com> 16:50:33
董一凡2013-01-30 16:41:24v大,你既然所有类继承自object,那你在做ui的时候,大可以模范qt了,在基类里加一个slot的概念,所有ui对象就都可以接收发过来的消息了
上一次我也是这么做的,这次戒了
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:52:50
为啥
vczh.Iskandar<vczh@163.com> 16:50:50
singleton
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:52:58
不是很爽么
vczh.Iskandar<vczh@163.com> 16:51:02
出事是肯定的
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:53:15
vczh.Iskandar<vczh@163.com> 16:51:21
你暴露个变量出来
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:53:45
单例是恶习
vczh.Iskandar<vczh@163.com> 16:51:41
都是要做成函数的
vczh四号粉丝(342775210) 16:51:42
我发现,public成员是bug神器
vczh.Iskandar<vczh@163.com> 16:52:04
gacui很少有public的变量
vczh四号粉丝(342775210) 16:52:31
我刚才秒了一下我们的代码,就发现一个内存泄露
我都不敢看了
vczh.xyz粉(54438159) 16:52:46
这个。。。
VCZH.粉丝数组[5](110086478) 16:53:03
太厉害了
vczh.Iskandar<vczh@163.com> 16:53:07
发邮件喷
vczh四号粉丝(342775210) 16:53:13
我才不喷
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:55:21
vczh四号粉丝(342775210) 16:52:31
我刚才秒了一下我们的代码,就发现一个内存泄露
我都不敢看了
你们平时怎么查内存溢出 内存错误 内存泄漏什么的?
vczh四号粉丝(342775210) 16:53:32
我们平时靠人肉看
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:55:38
vczh四号粉丝(342775210) 16:53:13
我才不喷
喷了就要解决,,,解决就要加班,,,要死,,,
vczh四号粉丝(342775210) 16:53:44
对
vczh.Iskandar<vczh@163.com> 16:53:46
看source control,谁写的谁解决
vczh四号粉丝(342775210) 16:53:55
不是我写的
vczh.Iskandar<vczh@163.com> 16:54:05
赖都赖不掉
vczh四号粉丝(342775210) 16:54:06
就行了
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:56:22
我估计这个问题该起来牵扯一票模块,,,
vczh.Iskandar<vczh@163.com> 16:54:26
visual studio打开以下咦annotate哪一行谁checkin进去的直接暴露出来
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:56:33
不然你就爽快的改了喷人,,,
SundayTooFar(5048977) 16:54:31
上个项目, 我秒了一下rpc协议。 结果发现几十个严重问题。 那才闹腾, 整个项目组加班了两周。。
vczh.Iskandar<vczh@163.com> 16:54:43
= =
web程序
你不招vczh
就不能用C++来写(逃
VCZH.粉丝数组[5](110086478) 16:55:00
vczh.Iskandar<vczh@163.com> 16:55:12
用C++来处理字符串
需要有坚定的信念
vczh.xyz粉(54438159) 16:55:20
各位巨巨都是神眼阿
vczh.Iskandar<vczh@163.com> 16:55:20
每一行代码都要充满智慧
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:57:26
搞死人
vczh四号粉丝(342775210) 16:55:31
要改的代码,也不多
只是我不愿意改
VCZH.粉丝数组[0]<errorcpp@qq.com> 16:57:49
上午问了没人理我,asn1有熟的没
vczh四号粉丝(342775210) 16:55:43
改了,他又会改回来
vczh.Iskandar<vczh@163.com> 16:55:44
先改后喷
没有