我读了一些关于智能指针的文档,还有一些问题。 我使用的是BOOST scoped_ptr,如果我的理解正确的话,它是一个唯一的指针。 所以我在类message_manager中使用了一个作用域指针来声明boost::interprocess中的message_queue对象。 我使用这个实现是因为message_queue对象将在稍后初始化,并且没有默认的构造函数可替代使用。
已经非常感谢了。
消息管理器。h
#include "boost/interprocess/ipc/message_queue.hpp"
#include "boost/scoped_ptr.hpp"
#include "data_storage.h"
using namespace boost::interprocess;
class message_manager
{
private:
boost::scoped_ptr<message_queue> mq;
public:
message_manager();
void send_msg(char message, unsigned int priority);
char receive_msg(unsigned int priority);
int createQUEUE(string name);
int destroyQUEUE(string name);
};
message_manager.cpp
int message_manager::createQUEUE(string name)
{
mq.reset(new message_queue(open_or_create, name.c_str(), 100, sizeof(int)));
cout << "Created queue named:" << name << endl;
return 1;
};
int message_manager::destroyQUEUE(string name)
{
if (mq->remove(name.c_str()))
{
cout << "Destroyed queue named:" << name << endl;
return 1;
}
else
{
cout << "Could not destroy queue named:" << name << endl;
return 0;
}
};
什么时候使用作用域指针有用
在C++11之前。
据我所知,所有用例都被unique_ptr
淘汰了,这些用例可以在标准库中找到。
什么时候被销毁?
对象的类型不会影响对象何时被销毁。 在这种情况下,作用域指针是成员变量,当包含成员变量的类被销毁时,成员变量也被销毁。
作用域指针对指向对象具有唯一的所有权,当作用域指针被销毁时,指向对象也被销毁。
我使用这个实现是因为message_queue对象将在稍后初始化,并且没有默认的构造函数可替代使用。 这是作用域指针的有效用法吗?
在这种情况下,std::optional
(如果需要C++17之前的支持,则使用boost等效工具)可能比任何智能指针更合适。