boost::lockfree::queue 作为静态数据成员
boost::lockfree::queue as static data member
我们有一个 class,我们将 boost::lockfree::queue
声明为 static
数据成员并覆盖 new
和 delete
运算符。 new
/ delete
运算符中的逻辑是创建 class 的实例以获取/放置队列中对象的指针。
问题是在测试用例成功完成后我遇到段错误。如果我评论 delete arr[i]
语句,则不再发生错误。
我的假设是,由于 Boost 队列是静态的,因此数据成员将最后被销毁,或者当程序结束时将调用它自己的析构函数,但我不确定它的析构函数中是什么导致中止或给出分段错误。
任何指示对解决问题真的很有帮助吗?
您需要注意 operator new
和 new expression(例如 new B()
)是不同的东西。 new 表达式 调用相应的 operator new
然后是对象的构造函数。 operator new
的工作是 return 未初始化的内存,此时对象不存在。
当您在 operator new
实现中调用 f->initialize();
时,该调用之后是对象的构造函数,它必须初始化所有对象的内存。
也就是说,在operator new
中只能实现内存缓存,不能实现对象缓存。
如果你想要对象的缓存,你需要使用工厂(工厂设计模式)。
查看 boost::pool 开始。
我们有一个 class,我们将 boost::lockfree::queue
声明为 static
数据成员并覆盖 new
和 delete
运算符。 new
/ delete
运算符中的逻辑是创建 class 的实例以获取/放置队列中对象的指针。
问题是在测试用例成功完成后我遇到段错误。如果我评论 delete arr[i]
语句,则不再发生错误。
我的假设是,由于 Boost 队列是静态的,因此数据成员将最后被销毁,或者当程序结束时将调用它自己的析构函数,但我不确定它的析构函数中是什么导致中止或给出分段错误。
任何指示对解决问题真的很有帮助吗?
您需要注意 operator new
和 new expression(例如 new B()
)是不同的东西。 new 表达式 调用相应的 operator new
然后是对象的构造函数。 operator new
的工作是 return 未初始化的内存,此时对象不存在。
当您在 operator new
实现中调用 f->initialize();
时,该调用之后是对象的构造函数,它必须初始化所有对象的内存。
也就是说,在operator new
中只能实现内存缓存,不能实现对象缓存。
如果你想要对象的缓存,你需要使用工厂(工厂设计模式)。
查看 boost::pool 开始。