标签: shared-ptr

C++ shared_ptr如何删除多个shared_ptr的指针

我在这个项目上工作,

我遇到的问题是,当我需要它时,它并没有真正被删除,因为它有一些指向它的共享指针.

我该如何解决这个问题,请帮忙.

c++ smart-pointers shared-ptr

0
推荐指数
1
解决办法
1282
查看次数

c ++:std :: 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;
}
Run Code Online (Sandbox Code Playgroud)

我开始这个样本,然后我得到下一个断言:_BLOCK_TYPE_IS_VALID(pHead-> nBloakUse).

我怎么能避免这个?

我使用以下代码来解决此问题:

class Foo;
typedef …
Run Code Online (Sandbox Code Playgroud)

c++ class smart-pointers shared-ptr weak-ptr

0
推荐指数
1
解决办法
1289
查看次数

专门的shared_ptr转换C++ 0x

这可能会推广到任何模板化的类,但我用shared_ptr遇到了这个问题.我有类系统,如:

class A {
protected:
    // some data
}

class B : public A {
    // some access functions
}

class C : public A {
    // some other access functions
}
Run Code Online (Sandbox Code Playgroud)

我正在使用这个概念,因为在我的库中我使用的是不应该向用户公开的函数集,所以我将这些函数分成两个接口类.现在,我知道我可以使用一个班级和朋友,但如果需要多个班级来访问这些功能,这会变得很难看.

但是,我有问题,那些类是通过arround传递的shared_ptr,我需要保留引用计数(因为数据会被破坏).因此,我需要在此示例中转换shared_ptr<B>shared_ptr<C>反之亦然.shared_ptr如果提供了所需的功能,是否允许这样的事情,如果有,那是什么?构造函数?分配运营商?或者我是否需要更高级别并投射整个指针而不仅仅是内容?到目前为止我没有运气.

是的,如果你有一个更好/更整洁的隐藏某些功能的方法,我会很高兴听到它,但我也想回答这个问题.

c++ class type-conversion shared-ptr c++11

0
推荐指数
1
解决办法
173
查看次数

简单的提升智能指针语法问题

使用任何一个boost::scoped_ptrboost::shared_ptr我得到错误

1> *\algomanager.cpp(28):错误C2064:term不计算为带1个参数的函数

我有这样的代码...

class X{
  boost::shared_ptr<cPreFilterProcess> preProcess;
public:
  X(){
    preProcess(new cPreFilterProcess(pars));
  }
};
Run Code Online (Sandbox Code Playgroud)

我错过了什么?谢谢.

c++ boost smart-pointers shared-ptr

0
推荐指数
1
解决办法
682
查看次数

如何通过std :: shared_ptr访问实例成员变量?

我不知道为什么我不能在网上找到这个地方,但我怎么能访问class instance member variables通过shared_ptr?我试着在下面的代码中注释掉的方式.他们都导致了segmentation fault.

我假设我可以通过raw pointer从中获取成员变量来访问成员变量,shared_ptr但我宁愿避免因为它不干净而否定了shared_ptr什么是访问这些成员变量的安全方法的价值?

#include <memory>
#include <iostream>

class Test{
public:
  int x;
  Test() : x(5){}
};

int main()
{
  std::shared_ptr<Test> f;
 // the following lines both produce seg faults
 //  std::cout << (*f).x << std::endl;
 //  std::cout << f->x << std::endl;

    }
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr

0
推荐指数
2
解决办法
2270
查看次数

C++指向一个对象,然后移动它的内存位置

我正在使用C++ 14.我们假设我有一个class X和一个std::vector<X> mVector.

我还有以下代码:

std::shared_ptr<X> AddX(const X &x)
{
    mVector.push_back[x];
    return std::shared_ptr<X>(&mVector[mVector.size()-1])
}
Run Code Online (Sandbox Code Playgroud)

此方法将对象x插入mVector并返回一个指向此插入对象的共享指针.

X x1;
shared_ptr<X> pX1 = AddX(x1);
Run Code Online (Sandbox Code Playgroud)

一切正常,但当我插入第二个对象

X x2;
shared_ptr<X> pX2 = AddX(x2);
Run Code Online (Sandbox Code Playgroud)

pX1不指向插入的对象x1,因为最后一个push_back已经在内存中移动了它的位置(在硬调试之后看到).这对我来说很可惜,因为我的程序需要这些指针才能正常工作,并且mVector需要是动态的,它一直在修改(使用新X对象或删除旧对象).

我怎样才能解决这个问题?我想比一种方法可以使用对象索引而不是它们的指针,但这会惩罚我的执行时间,因为我应该每次修改时更新许多属性mVector.是否可以管理它并仍然使用指针?

c++ pointers shared-ptr dynamic-memory-allocation

0
推荐指数
1
解决办法
63
查看次数

std :: move返回weak_ptr :: lock的返回值搞乱了shared_ptr的引用计数?

我需要解释以下行为:

#include <iostream>
#include <memory>
#include <vector>

struct A {
    std::string s = "foo";
    std::weak_ptr<A> h;
    std::shared_ptr<A> && getR() {
        return std::move(h.lock());
    }
    std::shared_ptr<A> getL() {
        return h.lock();
    }
};

std::vector< std::shared_ptr<A> > storage;
std::vector< std::weak_ptr<A> > accountant;

void store(std::shared_ptr<A> && rr) {
    std::cout << "store '" << rr->s << "' uses: " << rr.use_count() << std::endl;
    storage.push_back(std::move(rr));
}

int main() {
    // create keeper of A
    auto keeper = std::make_shared<A>();
    keeper->s = "bar";
    // store weak_ptr-type handle with accountant …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr weak-ptr c++11 c++14

0
推荐指数
1
解决办法
287
查看次数

比较运算符==中的共享指针常量

我偶然发现了我正在使用的共享指针的意外行为.

共享指针实现引用计数和分离(例如,复制),如果需要,包含非const使用的实例.
为实现此目的,对于每个getter函数,智能指针都有一个const和一个non-const版本,例如:operator T *()operator T const *() const.

问题:比较指针值nullptr导致分离.

预期:我认为比较运算符总是会调用const版本.

简化示例:(
此实现没有引用计数,但仍显示问题)

#include <iostream>

template<typename T>
class SharedPointer
{
public:
    inline operator T *() { std::cout << "Detached"; return d; }
    inline operator const T *() const { std::cout << "Not detached"; return d; }
    inline T *data() { std::cout << "Detached"; return d; }
    inline const T *data() const { std::cout << "Not detached"; …
Run Code Online (Sandbox Code Playgroud)

c++ const shared-ptr comparison-operators

0
推荐指数
1
解决办法
91
查看次数

构造本身为shared_ptr类型的模板化容器

我在绕着这个问题缠绕时遇到了一些困难,可能是因为我不完全理解底层的机制.

我有一个如下结构:

template <class T>
struct A {
    int id;
    T x;
}
Run Code Online (Sandbox Code Playgroud)

然后将此结构用作shared_ptr的类型:

typedef std::shared_ptr<A> A_ptr;
Run Code Online (Sandbox Code Playgroud)

然后将其存储在地图中:

typedef unordered_map<int , A_ptr> AMap;
Run Code Online (Sandbox Code Playgroud)

但是,当我编译时,我收到以下错误:

> error: type/value mismatch at argument 1 in template parameter list
> for 'template<class _Tp> class std::shared_ptr'   typedef
> std::shared_ptr<A> A_ptr;
Run Code Online (Sandbox Code Playgroud)

我已阅读有关类似问题的其他帖子,但他们都建议在结构中创建shared_ptr A. 我试过这个,即使我无法从逻辑上理解为什么它会对我的问题有所帮助,但它不起作用.任何帮助表示赞赏.

c++ templates shared-ptr

0
推荐指数
1
解决办法
38
查看次数

将清除共享智能指针上的呼叫重置

我最近改变了我的原始指针,std::shared_ptr在这样的容器中使用:

std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;
Run Code Online (Sandbox Code Playgroud)

当我打电话clear()给这个容器时,它会reset()在每个容器上调用方法std::shared_ptr吗?

c++ smart-pointers reset shared-ptr stdvector

0
推荐指数
1
解决办法
266
查看次数