我有很多boost::shared_ptr<MyClass>对象,在某些时候我故意想要delete其中一些来释放一些记忆.(我知道那时我将永远不再需要尖头MyClass物体了.)我怎么能这样做?
我想你不能只delete()用我得到的原始指针调用get().
我见过一个函数get_deleter(shared_ptr<T> const & p)中boost::shared_ptr,但我不知道如何使用它,并且还表示,实验就在旁边.(我想我有1.38升.)
也许只是boost::shared_ptr为变量分配一个新的空?这应该扔掉旧值并删除它.
假设我有类似的课程
class A{
public:
A(int a, boost::shared_ptr<int> ptr){
// whatever!
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,该ptr的默认值是多少?我希望能够使用创建该类的实例
A myA(5);
Run Code Online (Sandbox Code Playgroud)
当然我知道我可以用一个参数创建另一个构造函数,但我正在寻找类似的东西
A(int a, boost::shared_ptr<int> ptr = WAT?)
Run Code Online (Sandbox Code Playgroud)
可能吗?目前我正在使用双构造方式,但这样做会很棒.
我会使用像这样的单身人士:
Singleton* single = Singleton::instance();
single->do_it();
Run Code Online (Sandbox Code Playgroud)
我会使用这样一个未命名的类:
single.do_it();
Run Code Online (Sandbox Code Playgroud)
我觉得Singleton模式除了具有可读错误消息之外没有优于未命名类的优势.使用单例比使用未命名的类对象更笨拙:首先,客户端必须首先获得实例的句柄; 第二,Singleton::instance()可能需要考虑并发的实现者.
那么为什么以及如何选择一个单身人士而不是一个未命名的班级呢?
作为附录,虽然明确定义了一个未命名的类可能是
class {
// ...
}single;
Run Code Online (Sandbox Code Playgroud)
我可以这样定义它:
#ifndef NDEBUG
class Singleton__ { // readable error messages,
#else
class { // unnamed, clients can't instantiate
#endif
// ...
}single;
Run Code Online (Sandbox Code Playgroud)
后一种方法具有可读编译器错误消息的优点,但在调试模式下不是单例.