我been shown std::string
无法插入boost::lockfree::queue
。
boost::lockfree::queue
太贵了,不能放弃,所以我想我可以使用非常大的固定长度char
来根据requirements传递数据(假设自从我以后甚至满意) “我在学习如何满足这些要求方面遇到了麻烦”,但如果我想要大量的消息,就会耗尽内存。
是否存在具有复制构造函数,普通赋值运算符和普通析构函数的动态大小的文本对象?如果是的话,在哪里?如果没有,请概述如何表现一个。
答案 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_ptr
或vector<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;
}