2011-11-21 48 views
0

我有以下代码:C++:性病:: TR1 :: shared_ptr的从这个

#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-> 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; 
} 

但我认为这是一个更好的解决方案。

回答

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让你走,有很多草率的,但对于便携性的缘故,你应该选择一个或另一个。)

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; 
} 
相关问题