我有一个问题boost::shared_ptr<T>.
有很多线程.
using namespace boost;
class CResource
{
// xxxxxx
}
class CResourceBase
{
public:
void SetResource(shared_ptr<CResource> res)
{
m_Res = res;
}
shared_ptr<CResource> GetResource()
{
return m_Res;
}
private:
shared_ptr<CResource> m_Res;
}
CResourceBase base;
//----------------------------------------------
// Thread_A:
while (true)
{
//...
shared_ptr<CResource> nowResource = base.GetResource();
nowResource.doSomeThing();
//...
}
// Thread_B:
shared_ptr<CResource> nowResource;
base.SetResource(nowResource);
//...
Run Code Online (Sandbox Code Playgroud)
如果Thread_A不关心nowResource是最新的,那么这部分代码会有问题吗?
我的意思是当Thread_B没有SetResource()完全,Thread_A得到一个错误的智能点GetResource()?
线程安全是什么意思?
如果我不关心资源是否是最新的,那么shared_ptr<CResource> nowResource当程序nowResource被释放时会崩溃程序还是会破坏问题 …
这里有一个简单的问题:您是否可以明确删除boost::shared_ptr自己?你应该吗?
澄清,我不是说删除指针所持的指针shared_ptr.我的意思是实际的shared_ptr.我知道大多数人建议不要这样做,所以我只是想知道是否可以明确地做到这一点.
我使用shared_ptr基类的问题,我似乎无法在解除引用它时调用派生类的方法.我相信代码会比我更冗长:
class Base : public boost::enable_shared_from_this<Base>
{
public:
typedef boost::shared_ptr<BabelNet> pointer;
};
class Derived : public Base
{
public:
static pointer create()
{
return pointer(new Derived);
}
void anyMethod()
{
Base::pointer foo = Derived::create();
// I can't call any method of Derived with foo
// How can I manage to do this ?
// is dynamic_cast a valid answer ?
foo->derivedMethod(); // -> compilation fail
}
};
Run Code Online (Sandbox Code Playgroud) boost::intrusive_ptr要求intrusive_ptr_add_ref和intrusive_ptr_release定义.为什么不提供基类来执行此操作?这里有一个例子:http://lists.boost.org/Archives/boost/2004/06/66957.php,但海报上写着"我不一定认为这是一个好主意".为什么不?
更新:我认为这个类可能被多重继承滥用的事实是不够的.从具有自己的引用计数的多个基类派生的任何类都将具有相同的问题.这些refcounts是否通过基类实现是没有区别的.
我认为多线程没有任何问题; boost::shared_ptr提供原子引用计数,这个类也可以.
可以在多态中使用boost :: smart_ptr,如scoped_ptr和shared_ptr吗?
class SomeClass
{
public:
SomeClass()
{
a_ptr.reset(new SubClass);
}
private:
boost::scoped_ptr<SuperClass> a_ptr;
}
Run Code Online (Sandbox Code Playgroud) 我一直在玩一些Boost组件,而我正在研究的项目中唯一一个我认为是直接需要的组件boost::shared_ptr.
是否难以shared_ptr在我的项目中包含所需文件,或至少只包含Boost smart_ptr目录的文件?他们似乎对Boost的其他部分有一些外部依赖 - 但我认为有一种简单的方法来使用Boost库的某些组件而我却错过了它.
如果你能告诉我我需要哪些部件或者给我一个好的教程,我将非常感激!
Boost智能指针可以与多态一起使用,但是如何将子类强制转换为指针?
using namespace boost;
// ...
shared_ptr<SuperClass> a_ptr(new SubClass);
// ...
shared_ptr<SubClass> b_ptr = (shared_ptr<SubClass>)a_ptr; // Doesn't compile
Run Code Online (Sandbox Code Playgroud)
最后一行不编译并给出 error C2440: 'type cast' : cannot convert from 'boost::shared_ptr<T>' to 'boost::shared_ptr<T>'
对于boost::weak_ptr该operator<定义,使其能够在关联容器中使用.
我的问题是:几个weak_ptr对象的排序顺序是否稳定,即使它们中的一些变为零的引用数量?容器不是那么乱std::set吗?
例:
using namespace boost;
shared_ptr<A> sptrA1(new A);
weak_ptr<A> wptrA1 = sptrA1;
weak_ptr<A> wptrA2;
{ // begin Scope 1
shared_ptr<A> sptrA2(new A);
wptrA2 = sptrA2;
assert(wptrA1 < wptrA2); // assert #1
}
assert(wptrA1 < wptrA2); // assert #2
Run Code Online (Sandbox Code Playgroud)
wptrA2范围1之前和之后是否处于相同的状态?我正在学习使用boost智能指针,但我对一些情况有点困惑.假设我正在实现一个状态机,其中每个状态都由一个更新方法实现.每个州都可以返回自己或创建一个新的状态对象:
struct state
{
virtual state* update() = 0; // The point: I want to return a smart pointer here
};
struct stateA : public state
{
virtual state* update() { return this; }
};
struct stateB : public state
{
virtual state* update() { if(some condition) return new stateA() else return this; }
Run Code Online (Sandbox Code Playgroud)
};
状态机循环看起来像这样:
while(true)
current_state = current_state->update();
Run Code Online (Sandbox Code Playgroud)
你能翻译这段代码来使用boost智能指针吗?当谈到"返回这个"部分时,我有点困惑,因为我不知道该怎么做.基本上我觉得返回像"return boost :: shared_ptr(this);"这样的东西是没用的.因为它不安全 我该怎么办?
我有一个shared_ptr和一个weak_ptr
typedef boost::weak_ptr<classname> classnamePtr;
typedef boost::shared_ptr<x> xPtr;
Run Code Online (Sandbox Code Playgroud)
如何将weak_ptr转换为shared_ptr
shared_ptr = weak_ptr;
Xptr = classnameptr; ?????
Run Code Online (Sandbox Code Playgroud)