我有以下代码:
#include <memory>
class Foo;
typedef std::tr1::shared_ptr<Foo> pFoo_t;
class DoSomething
{
public:
static void doSomething( pFoo_t p) { printf( "doing something...\n"); }
static void doSomethingElse( pFoo_t p) { printf( "doing something else...\n"); }
};
class Foo
{
public:
Foo() { printf( "foo()\n"); }
~Foo() { printf( "~foo()\n"); }
public:
void doSomething() { DoSomething::doSomething(pFoo_t(this)); }
void doSomethingElse() { DoSomething::doSomethingElse(pFoo_t(this)); }
};
int _tmain(int argc, _TCHAR* argv[])
{
Foo foo;
foo.doSomething();
foo.doSomethingElse();
return 0;
}
我开始这个样本,然后我得到下一个断言:_BLOCK_TYPE_IS_VALID(pHead-&gt; nBloakUse)。
我该如何避免这种情况?
我使用以下代码来解决此问题:
class Foo;
typedef std::tr1::shared_ptr<Foo> pFoo_t;
class DoSomething
{
public:
static void doSomething( pFoo_t p) { printf( "doing something...\n"); }
static void doSomethingElse( pFoo_t p) { printf( "doing something else...\n"); }
};
class Foo
{
public:
void Init(pFoo_t _pFoo) { m_pFoo = _pFoo; }
Foo() { printf( "foo()\n"); }
~Foo() { printf( "~foo()\n"); }
public:
void doSomething() { DoSomething::doSomething(m_pFoo.lock()); }
void doSomethingElse() { DoSomething::doSomethingElse(m_pFoo.lock()); }
private:
std::tr1::weak_ptr<Foo> m_pFoo;
};
int _tmain(int argc, _TCHAR* argv[])
{
{
Foo * foo = new Foo();
pFoo_t pFoo(foo);
foo->Init(pFoo);
foo->doSomething();
foo->doSomethingElse();
}
return 0;
}
但我认为有更好的解决方案。
答案 0 :(得分:6)
请勿手动执行此操作。让您的类继承自std::enable_shared_from_this
并使用std::shared_from_this()
获取共享指针。
此外,您应该将对象直接分配到共享指针:
pFoo_t pFoo = std::make_shared<Foo>(); // good
pFoo_t pFoo(new Foo()); // legacy
(顺便说一句,您要么为此包含<memory>
,要么使用所有这些的TR1版本(然后没有make_shared
)并包含<tr1/memory>
。我知道MSVC可以让你摆脱很多邋,,但为了便携,你应该选择其中一个。)
答案 1 :(得分:0)
感谢您的回复。
你是对的。
现在正确的代码如下:
class Foo;
typedef std::tr1::shared_ptr<Foo> pFoo_t;
class DoSomething
{
public:
static void doSomething( pFoo_t p) { printf( "doing something...\n"); }
static void doSomethingElse( pFoo_t p) { printf( "doing something else...\n"); }
};
class Foo : public std::enable_shared_from_this<Foo>
{
public:
Foo() { printf( "foo()\n"); }
~Foo() { printf( "~foo()\n"); }
public:
void doSomething() { DoSomething::doSomething(this->shared_from_this()); }
void doSomethingElse() { DoSomething::doSomethingElse(this->shared_from_this()); }
};
int _tmain(int argc, _TCHAR* argv[])
{
{
auto pFoo = std::make_shared<Foo>();
pFoo->doSomething();
pFoo->doSomethingElse();
}
return 0;
}