
@H_419_8@
@H_419_8@
class Atom{public : enum flags { IS_STRING,IS_EMPTY,HAS_GOT_copIED,MARKER };private: voID* m_value; std::bitset<MARKER> m_flags;public: ..... Atom( Atom& atm ) { atm.m_flags.set( HAS_GOT_copIED ); ..... } ..... ~Atom() { if( m_flags.test(IS_STRING) && !m_flags.test(HAS_GOT_copIED) ) { std::string* val = static_cast<std::string*>(m_value); delete val; } }}; 这是一个很好的方法来找出是否没有更多的std :: string *引用?任何意见..@H_419_8@
我看过boost :: any和poco :: DynamicAny.由于我需要序列化,我不能使用它们.@H_419_8@
谢谢,
戈库尔.@H_419_8@解决方法 这种方法的一个主要缺陷是你真的需要一个引用计数,而不是一个单独的“已被复制”标志.如果您多次复制字符串,该位将不起作用.如上所述,如果您创建Atom的副本并在原始副本之前删除副本,则会遇到麻烦:
@H_419_8@
@H_419_8@
Atom a("hello world");if (...) { Atom b(a); // b is destroyed,deleting the string}// Uh oh,the string's been deleted but a is still referencing it.cout << (string) a; 我不会重新发明轮子.如果boost :: any不能正常工作,你仍然可以在内部使用它代替m_value字段来存储Atom类的数据.这将为您处理所有构造/复制/销毁细节.@H_419_8@ 总结
以上是内存溢出为你收集整理的C通用数据类型全部内容,希望文章能够帮你解决C通用数据类型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)