C++ C++;指针向量、向量声明和指针删除
假设我有一个singleton类: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();
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风格编写的;)@冰袋你到底是什么意思?我的课有什么问题吗?我怎样才能提高呢?不,你的课没有问题。我的意思是,单身并不一定总是有效的。如果符合要求,可以在程序运行的特定时间段内实例化单例。谢谢你的回答,他们为我澄清了很多。我仍在试图弄清楚设计,因此我的问题模糊不清。是的,我并没有真正想清楚,我可以用一种更优雅的方式编写代码,而不需要单例。单身并不是一个真正的要求,但出于某种原因,我认为它应该存在。