2011-11-21 64 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; 
} 
相關問題