c++: std::tr1::shared_ptr 从这个

标签 c++ class shared-ptr smart-pointers weak-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;
}

但我认为有更好的解决方案。

最佳答案

不要手动实现。让你的类继承自 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 让您得到去掉很多草率,但为了便于携带,您应该选择其中之一。)

关于c++: std::tr1::shared_ptr 从这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8213457/

相关文章:

c++ - 为什么 shared_ptr 实现中的 ref_count 是 int*

c++ - Visual Studio 2010 项目中引用的库

c++ - 是否可以在其范围之外访问局部变量的内存?

c++ - 错误 C2011 : 'XX' : 'class' type redefinition

java - 确定项目中的测试类

c++ - C++ std::copy_if 中的 Lambda 表达式

c++ - 使用 shared_ptr 的开销和实现

c++ - 在 C++ 中将 unix 时间戳作为字符串获取

VS2010 中使用 lambda 参数捕获的 C++ 嵌套 lambda 错误?

c++ - 如何正确使用类函数的指针