我已经被证明不能std::string
将 a 插入到boost::lockfree::queue
.
boost::lockfree::queue
太有价值了,不能放弃,所以我认为我可以根据要求char
使用非常大的固定长度s 来传递数据(假设即使满足,因为我在学习如何满足这些要求方面遇到困难),但这会吃掉如果我想要大消息,请增加内存。
是否存在具有复制构造函数、普通赋值运算符和普通析构函数的动态大小的文本对象?如果有,在哪里?如果不是,请概述如何体现一个。
是否存在具有复制构造函数、普通赋值运算符和普通析构函数的动态大小的文本对象?
动态大小,不。对于具有平凡析构函数的东西,它要求对象的析构函数是隐式(或默认)的,并且任何非静态成员对象也具有隐式(或默认)析构函数。由于动态分配的任何内容都需要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
数组。这意味着没有动态分配,因此是固定大小。
具有简单复制 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;
}