【问题标题】:boost circular_buffer holding pointersboost circular_buffer 持有指针
【发布时间】:2017-08-09 20:01:11
【问题描述】:

有没有办法确保我的对象在循环缓冲区中被覆盖之前被删除?这是一些代码来说明我的问题。

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

【问题讨论】:

  • 我在这里陷入了石器时代,只能使用没有 c++11 规范的 gcc 4.4.7,因此没有 std::make_unique 所以没有智能指针
  • 您可以(并且应该)编辑您的问题,而不是在 cmets 中添加重要信息。

标签: boost circular-buffer


【解决方案1】:

这是智能指针的经典场景。任何智能指针。

最简单的选择是 std::unique_ptr:

Live On Coliru

#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";
}

打印:

MyObject::MyObject _i=0
MyObject::MyObject _i=1
MyObject::MyObject _i=2
MyObject::MyObject _i=3
MyObject::MyObject _i=4
Full, pushing extra
MyObject::MyObject _i=5
MyObject::~MyObject _i=0
Done
MyObject::~MyObject _i=1
MyObject::~MyObject _i=2
MyObject::~MyObject _i=3
MyObject::~MyObject _i=4
MyObject::~MyObject _i=5

【讨论】:

  • 感谢@sehe 的回复。我应该在描述中指出,我在这里陷入了石器时代,只能使用没有 c++11 规范的 gcc 4.4.7,因此没有std::make_unique
  • 所以,将std::make_unique&lt;MyObject&gt;(n) 替换为Ptr(new MyObject(n))。或者写你自己的3行make_unique&lt;T&gt;:)
  • 完全经过 c++11 验证的版本:coliru.stacked-crooked.com/a/5029747707aa4cca
  • 如果你不能拥有 unique_ptr:completely c++03-proofed
  • 谢谢@sehe,最后一个链接就像我想要的那样工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2015-08-08
  • 2010-10-11
  • 2015-02-13
  • 2012-11-29
  • 1970-01-01
相关资源
最近更新 更多