我们有一个课程,我们将boost::lockfree::queue
声明为static
数据成员并覆盖new
和delete
运算符。 new
/ delete
运算符中的逻辑是创建一个类实例来获取/放置队列中对象的指针。
问题是在测试用例完成后哪个成功,我得到段错误。如果我评论delete arr[i]
语句,则不再出现故障。
我的假设是因为Boost队列是静态的,因此数据成员将被最后销毁,或者当程序结束时会调用它自己的析构函数,但后来我不确定它的析构函数中导致中止或给出的是什么分段错误。
任何指针对解决问题都非常有帮助吗?
答案 0 :(得分:2)
您需要注意operator new
和new expression(例如new B()
)是不同的事情。 新表达式调用相应的operator new
,然后调用对象的构造函数。 operator new
的工作是返回未初始化的内存,此时该对象不存在。
当你在f->initialize();
实现中调用operator new
时,该调用之后是对象的构造函数,它必须初始化所有对象的内存。
换句话说,您只能在operator new
中实现内存缓存,而不是对象缓存。
如果需要对象缓存,则需要使用工厂(工厂设计模式)。
查看boost::pool即可开始使用。