1

我已经被证明不能std::string将 a 插入到boost::lockfree::queue.

boost::lockfree::queue太有价值了,不能放弃,所以我认为我可以根据要求char使用非常大的固定长度s 来传递数据(假设即使满足,因为我在学习如何满足这些要求方面遇到困难),但这会吃掉如果我想要大消息,请增加内存。

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

4

2 回答 2

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_;
}

然而,通过这样做,析构函数变成了用户定义的,因此是不平凡的。

这将是任何动态分配的问题。请注意,我们无法通过使用 ashared_ptr或 avector<char>作为成员变量来解决此问题;尽管它们可能是在我们的类中分配的堆栈,但在下面,它们只是为我们处理内存管理:在与这些类​​似的地方,有 anew []和对应的delete [],因此它们将具有非平凡的析构函数。

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

于 2013-09-10T03:30:16.383 回答
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;
}
于 2013-09-10T03:42:33.717 回答