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
,因此没有智能指针你可以(也应该)编辑你的问题,而不是在评论中添加重要信息。