提问者:小点点

什么时候使用作用域指针有用,什么时候销毁它?


我读了一些关于智能指针的文档,还有一些问题。 我使用的是BOOST scoped_ptr,如果我的理解正确的话,它是一个唯一的指针。 所以我在类message_manager中使用了一个作用域指针来声明boost::interprocess中的message_queue对象。 我使用这个实现是因为message_queue对象将在稍后初始化,并且没有默认的构造函数可替代使用。

  1. 这是否是作用域指针的有效用法?
  2. 在我的理解中,作用域指针会在作用域结束时自动销毁,但是作用域什么时候结束呢? 当message_manager对象被销毁时是否结束?

已经非常感谢了。

消息管理器。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;
    }

};

共1个答案

匿名用户

什么时候使用作用域指针有用

在C++11之前。

据我所知,所有用例都被unique_ptr淘汰了,这些用例可以在标准库中找到。

什么时候被销毁?

对象的类型不会影响对象何时被销毁。 在这种情况下,作用域指针是成员变量,当包含成员变量的类被销毁时,成员变量也被销毁。

作用域指针对指向对象具有唯一的所有权,当作用域指针被销毁时,指向对象也被销毁。

我使用这个实现是因为message_queue对象将在稍后初始化,并且没有默认的构造函数可替代使用。 这是作用域指针的有效用法吗?

在这种情况下,std::optional(如果需要C++17之前的支持,则使用boost等效工具)可能比任何智能指针更合适。