动态大小的文本对象,带有复制构造函数,普通赋值运算符和普通的析构函数

时间:2013-09-10 03:18:29

标签: c++ text c++11 static-libraries dynamic-sizing

been shown std::string无法插入boost::lockfree::queue

boost::lockfree::queue太贵了,不能放弃,所以我想我可以使用非常大的固定长度char来根据requirements传递数据(假设自从我以后甚至满意) “我在学习如何满足这些要求方面遇到了麻烦”,但如果我想要大量的消息,就会耗尽内存。

是否存在具有复制构造函数,普通赋值运算符和普通析构函数的动态大小的文本对象?如果是的话,在哪里?如果没有,请概述如何表现一个。

2 个答案:

答案 0 :(得分:1)

  

是否存在具有复制构造函数,普通赋值运算符和普通析构函数的动态大小的文本对象?

动态大小,没有。对于具有普通析构函数的东西,它要求对象的析构函数是隐式的(或默认的),并且任何非静态成员对象也具有隐式(或默认)析构函数。由于动态分配的任何内容都需要在析构函数的某个位置使用delete [],因此不能满足此约束。

为了扩展上述内容,请考虑std::string中发生的事情的一个(非常简化的)示例:

namespace std
{
    // Ignoring templates and std::basic_string for simplicity
    class string 
    {
    private:
        char* internal_;
        // Other fields

    public:
        string(const char* str)
          : internal_(new char[strlen(str) + 1])
        { }

    };
}

考虑如果我们将析构函数保留为默认值会发生什么:它会破坏堆栈分配的char *(即指针本身,而不是它指向的那个)。这会导致内存泄漏,因为我们现在已经分配了没有引用的空间,因此永远不会被释放。所以我们需要声明一个析构函数:

~string()
{
    delete[] internal_;
}

但是,通过这样做,析构函数变为用户定义的,因此非常重要。

这将是动态分配的任何问题。请注意,我们无法通过使用shared_ptrvector<char>之类的内容作为成员变量来解决此问题。即使它们可能是我们班级中的堆栈分配,但它们只是为我们处理内存管理:在这些行的某个地方,有一个new []和相应的delete [],因此它们会有非平凡的破坏者。

要满足此要求,您需要使用堆栈分配的char数组。这意味着没有动态分配,因此也就是固定大小。

答案 1 :(得分:1)

无法使用具有普通复制ctor / dtor的动态大小类型。您的问题有两种解决方案,使用固定大小的类型,或在队列中存储指针:

boost::lockfree::queue<std::string*> queue(some_size);
// push on via new
queue.push(new std::string("blah"));
// pop and delete
std::string* ptr;
if(queue.pop(ptr))
{
   delete ptr;
}