boost循环缓冲区保持指针
有什么方法可以确保在循环缓冲区中覆盖对象之前将其删除?下面是一些代码来说明我的问题boost循环缓冲区保持指针,boost,circular-buffer,Boost,Circular Buffer,有什么方法可以确保在循环缓冲区中覆盖对象之前将其删除?下面是一些代码来说明我的问题 boost::circular_buffer<MyObject*> cBuf(5); cBuf.push_back(new MyObject()); // cBuf[0] cBuf.push_back(new MyObject()); // cBuf[1] cBuf.push_back(new MyObject()); // cBuf[2] cBuf.push_back(new MyObject())
boost::circular_buffer<MyObject*> cBuf(5);
cBuf.push_back(new MyObject()); // cBuf[0]
cBuf.push_back(new MyObject()); // cBuf[1]
cBuf.push_back(new MyObject()); // cBuf[2]
cBuf.push_back(new MyObject()); // cBuf[3]
cBuf.push_back(new MyObject()); // cBuf[4]
// before this overwrite occurs, how do i make sure the pointer
// position cBuf[0] is deleted?
cBuf.push_back(new MyObject()); // this will overwrite position 0
boost::循环缓冲区cBuf(5);
cBuf.push_back(新的MyObject());//cBuf[0]
cBuf.push_back(新的MyObject());//cBuf[1]
cBuf.push_back(新的MyObject());//cBuf[2]
cBuf.push_back(新的MyObject());//cBuf[3]
cBuf.push_back(新的MyObject());//cBuf[4]
//在发生此覆盖之前,如何确保指针
//位置cBuf[0]是否已删除?
cBuf.push_back(新的MyObject());//这将覆盖位置0
这是智能指针的经典场景。任何智能指针
最简单的选择是std::unique\u ptr:
#include <boost/circular_buffer.hpp>
#include <iostream>
struct MyObject {
MyObject(int i) : _i(i) { std::cout << __FUNCTION__ << " _i=" << _i << "\n"; }
~MyObject() { std::cout << __FUNCTION__ << " _i=" << _i << "\n"; }
int _i;
};
int main() {
using Ptr = std::unique_ptr<MyObject>;
boost::circular_buffer<Ptr> cBuf(5);
cBuf.push_back(std::make_unique<MyObject>(0)); // cBuf[0]
cBuf.push_back(std::make_unique<MyObject>(1)); // cBuf[1]
cBuf.push_back(std::make_unique<MyObject>(2)); // cBuf[2]
cBuf.push_back(std::make_unique<MyObject>(3)); // cBuf[3]
cBuf.push_back(std::make_unique<MyObject>(4)); // cBuf[4]
std::cout << "Full, pushing extra\n";
cBuf.push_back(std::make_unique<MyObject>(5)); // this will overwrite position 0
std::cout << "Done\n";
}
这是智能指针的经典场景。任何智能指针 最简单的选择是std::unique\u ptr:
#include <boost/circular_buffer.hpp>
#include <iostream>
struct MyObject {
MyObject(int i) : _i(i) { std::cout << __FUNCTION__ << " _i=" << _i << "\n"; }
~MyObject() { std::cout << __FUNCTION__ << " _i=" << _i << "\n"; }
int _i;
};
int main() {
using Ptr = std::unique_ptr<MyObject>;
boost::circular_buffer<Ptr> cBuf(5);
cBuf.push_back(std::make_unique<MyObject>(0)); // cBuf[0]
cBuf.push_back(std::make_unique<MyObject>(1)); // cBuf[1]
cBuf.push_back(std::make_unique<MyObject>(2)); // cBuf[2]
cBuf.push_back(std::make_unique<MyObject>(3)); // cBuf[3]
cBuf.push_back(std::make_unique<MyObject>(4)); // cBuf[4]
std::cout << "Full, pushing extra\n";
cBuf.push_back(std::make_unique<MyObject>(5)); // this will overwrite position 0
std::cout << "Done\n";
}
谢谢@sehe的回复。我应该在描述中注意到,我被困在石器时代,只能使用GCC4.4.7,它没有c++11规范,因此没有
std::make_unique
所以,用Ptr(新的MyObject(n))
替换std::make_unique(n)
。或者编写自己的三行make_unique
:)完全经过c++11验证的版本:以防您无法拥有unique_ptr:thank you@sehe最后一个链接可以像我希望的那样工作!谢谢@sehe的回复。我应该在描述中注意到,我被困在石器时代,只能使用GCC4.4.7,它没有c++11规范,因此没有std::make_unique
所以,用Ptr(新的MyObject(n))
替换std::make_unique(n)
。或者编写自己的三行make_unique
:)完全经过c++11验证的版本:以防您无法拥有unique_ptr:thank you@sehe最后一个链接可以像我希望的那样工作!我被困在石器时代,只能使用GCC4.4.7,它没有c++11规范,因此没有std::make_unique
,因此没有智能指针可以(也应该)使用编辑你的问题,而不是在评论中添加重要信息。我被困在石器时代,只能使用gcc 4.4.7,它没有c++11规范,因此没有std::make_unique
,因此没有智能指针你可以(也应该)编辑你的问题,而不是在评论中添加重要信息。