C++ C++;指针向量、向量声明和指针删除

C++ C++;指针向量、向量声明和指针删除,c++,pointers,memory-management,memory-leaks,singleton,C++,Pointers,Memory Management,Memory Leaks,Singleton,假设我有一个singleton类: class Singleton { public: static Singleton* getInstance(); void doit(); std::vector<Object*>& getVector(); private: std::vector<Object*> _vector; static Singleton *instance; Singleton();

假设我有一个singleton类:

class Singleton {
public:
    static Singleton* getInstance();
    void doit();
    std::vector<Object*>& getVector();

private:
    std::vector<Object*> _vector;
    static Singleton *instance;
    Singleton();
    ~Singleton();
    Singleton(const Singleton&);
};

class Delegator {
public:
        void main();
}
类单例{
公众:
静态单例*getInstance();
void doit();
std::vector&getVector();
私人:
std::vector\u vector;
静态单例*实例;
Singleton();
~Singleton();
单例(常数单例&);
};
类委托人{
公众:
void main();
}
  • doit
    方法中,我用指向对象的指针填充
    \u向量
  • Delegator
    类的
    main()
    中,我调用
    getVector()
    并显示结果
鉴于这种抽象,我有以下问题:

  • 我可以从
    Delegator
    (显示结果后)中删除
    main()
    中指向对象实例的所有指针吗。如果是,建议这样做吗
  • 单身汉会被毁灭吗?换句话说,在
    getVector()
    中返回的引用是否始终有效
  • getVector()
    中,我返回对向量的引用,而不是向量的副本。假设向量只包含指向对象的指针,并且不会修改
    Singleton
    类之外的向量内容,那么返回引用是否能提高效率
    提前感谢您

    典型的单例模式如下所示(其他变体也是可能的,比如对实例使用引用而不是指针)

    singleton.h:

    class Singleton {
    public:
        static Singleton* getInstance();
        ...
    
    private:
        static Singleton *instance;
        Singleton();                 //permit construction of instances
        ~Singleton();                //permit deletion of instances
        Singleton(const Singleton&); //don't provide an implementation for copy-ctr.
    };
    
    singleton.cpp:

    Singleton *Singleton::instance = 0;
    
    Singleton::Singleton() {
        // init your stuff
    }
    
    Singleton::~Singleton() {
    }
    
    Singleton *Singleton::getInstance() {
        if(!instance) instance = new Singleton();
        return instance;
    }
    
    在本例中,您返回一个单例实例的副本,这违反了单例模式

    回答你的问题。问题:单身人士永远不应该被删除。但是,我们定义了析构函数,以便将其设置为私有,否则调用方可以
    删除Singleton::getInstance()
    ,这不是一个好主意

    也就是说,单身在大多数情况下被认为是一种反模式。在大多数情况下,实用程序类更适合。实用程序类是一个非常相似的概念,但是它们实现所有静态的东西,而不是使用实例。当您需要初始化代码时,请使用
    init()
    方法执行此操作(因为不涉及构造函数)

  • 这完全取决于您的需求和设计。从这个角度来看,您呈现的代码是中性的

  • 同样,这取决于您的设计和实现。
    单例模式本身并不意味着生存期。如果您需要
    singleton
    在某个生命周期内有效,则需要通过其他方式(例如,定义它的全局实例)来确保

  • 是的,性能有所提高。
    vector
    的实例不是一个简单的
    数组
    ,除了实际存储的信息外,还包含大量的数据。如果按值返回,所有数据都将被复制(本次讨论将优化放在一边)。另外,正如在另一个答案中正确指出的那样,按值返回实际上打破了
    单例模式


  • 我对你没问的问题的第一个答案是:

    不要使用单例。这是一种反模式。这会使它接触到的代码变得更糟。它扼杀了可测试性,使将来修改程序变得更加困难

    这篇非常优秀的文章非常详细地讨论了

    要回答您提出的问题

  • 是的,你可以。当然,这些指针仍然在向量中,因此向量现在将包含大量悬空指针。所以你也应该清除向量
  • 有了你拥有的代码,它将永远不会被摧毁。根据某些定义,这会使您的单身成为内存泄漏。因此,是的,引用将始终有效
  • 是的,返回引用会大大提高性能。复制向量意味着复制向量中的所有元素。请注意,这意味着将复制所有指针,而不是它们指向的
    对象。此外,如果您返回一个副本,并让
    main
    函数删除所有指针,则绝对可以保证有一个向量,其中包含大量悬空指针

  • 那里没有实际的实现!我们如何知道任何内容是否有效?
    getInstance
    返回单例的副本?那不是什么单身汉。“让我们假设我有一个单身汉”这是你的问题。你可能会发现这篇帖子很有用:@jogojapan谢谢你的链接,我正是我要找的。至于你之前的问题,我并不是真正要求将类设置为singleton,只是认为在以后的阶段可能需要它。实用程序类是一个非常类似的概念,但它们实现所有内容都是静态的,而不是使用实例。那就把它设为名称空间吧。不需要类。
    Singleton
    本身并不意味着生命周期,尽管在大多数用例中,它会与之耦合。@Zoidberg'——这一点很好。我只是习惯于把它们写成类。似乎是大学Java编程课程的遗骸…-。-我的单例模式代码也是用Java风格编写的;)@冰袋你到底是什么意思?我的课有什么问题吗?我怎样才能提高呢?不,你的课没有问题。我的意思是,单身并不一定总是有效的。如果符合要求,可以在程序运行的特定时间段内实例化单例。谢谢你的回答,他们为我澄清了很多。我仍在试图弄清楚设计,因此我的问题模糊不清。是的,我并没有真正想清楚,我可以用一种更优雅的方式编写代码,而不需要单例。单身并不是一个真正的要求,但出于某种原因,我认为它应该存在。