问题标签 [shared-ptr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
903 浏览

c++ - 删除共享指针

我有一个指向 a 的指针QScriptEngine,我正在通过 class 的重载类构造函数Evaluator并将其分配给QScriptEngine *engine_(类Property子类Evaluator,并调用此构造函数Evaluator,将其传递给已分配的QScriptEngine)。不带参数的构造函数创建新QScriptEngine指针(以这种方式创建Generic子类Evaluator)。engine_在我测试 if is not的析构函数中NULL,删除指针,然后分配它NULLengine_现在派生的指针 ( )Property也应该是NULL? 有些东西告诉我事实并非如此。如果没有,您如何处理这种情况?我需要QScriptEngine始终是同一个实例。QScriptEngine's = 运算符是私有的,否则我会一起避免指针。

我在另一个 SO question 中看到了一些关于共享指针(boost::shared_ptr和)的信息。std:tr1::shared_ptr我已经在正则表达式库中使用了 boost,所以如果这是处理这个问题的最佳方法,boost 并不是不可能的。对于一般 C++ 知识和未来的项目,希望有一种非提升方式。

0 投票
4 回答
16142 浏览

c++ - shared_ptr 与模板

如果我想创建一个指向 struct 的智能指针,我会这样做:

所以,我可以写以下内容:

但是,如果我有这样的模板结构:

我想写以下内容:

那么,我应该如何声明 B_Ptr ?

0 投票
7 回答
2685 浏览

c++ - 多态性和指针向量的c ++问题

考虑以下示例代码:

我目前的项目中有这样的问题。客户端代码使用BarCollection,它存储指向Barsd_foos其中声明的指针FooCollection。我现在想将指向 Bars 的指针集合公开给客户端代码。我可以让客户端代码访问指向Foos 的指针向量并将它们转换为Bar客户端代码中指向 s 的指针,但这感觉不对,因为客户端不必知道Foo' 的存在。

我还可以定义一个get()成员来从中检索对象d_foos并对其进行强制转换,但这感觉很笨拙。最好,我只想将 d_foos 作为 a 返回vector<shared_ptr<Bar> > &,但我似乎无法做到这一点。

也可能是我的设计完全错误。不过,这似乎是最自然的解决方案,因为Bar它是专业化的,Foo并且BarCollection是专业化的,FooCollection并且它们共享功能。

您能否提出很好的解决方案来实施getBarsBarCollection更好的设计替代方案?

编辑:

原来我的设计确实很糟糕。BarCollection 不是 FooCollection,尽管它需要 FooCollection 的所有功能。我目前基于以下答案的解决方案 - 这更清洁 - 现在是:

感谢所有优秀的建议和例子!

0 投票
5 回答
43333 浏览

c++ - shared_ptr 与 scoped_ptr

scoped_ptr不可复制,正在从范围中删除。所以它是一种限制shared_ptr。因此,除了确实需要限制复制操作的情况外,似乎shared_ptr更好用。因为有时您不知道是否需要创建对象的副本。所以问题是:除了上面提到的情况外,我们是否可以认为shared_ptr更好(或推荐)使用而不是scoped_ptr. 是否scoped_ptr工作得更快shared_ptr,或者它有什么优势?

谢谢!

0 投票
1 回答
1721 浏览

c++ - std::list of boost::shared_ptr 的迭代器问题

我在使用以下代码时遇到问题:

gcc (4.2.1) 告诉我:

我想知道为什么我不能为 MessagePointer 的列表创建迭代器。

有任何想法吗?

谢谢你。

0 投票
1 回答
20968 浏览

c++ - 如何使用 shared_ptr 避免内存泄漏?

考虑以下代码。

没有输出没有调用析构函数。内存泄漏。我一直认为智能指针有助于避免内存泄漏。

如果我需要在类中进行交叉引用,我应该怎么做?

0 投票
5 回答
32058 浏览

c++ - 从 shared_ptr 中分离一个指针?

可能重复:
如何从 boost::shared_ptr 释放指针?

我的接口的一个函数返回一个指向对象的指针。用户应该拥有该对象的所有权。我不想返回 Boost.shared_ptr,因为我不想强迫客户使用 boost。但是,在内部,我想将指针存储在 shared_ptr 中,以防止出现异常等情况下的内存泄漏。似乎没有办法将指针与共享指针分离。这里有什么想法吗?

0 投票
4 回答
19244 浏览

boost - 常量 shared_ptr 到 shared_ptr

如何将指向 const 对象的 shared_ptr 转换为指向非 const 对象的 shared_ptr 。我正在尝试执行以下操作:

但它不起作用。

0 投票
2 回答
964 浏览

c++ - shared_ptr、订阅、析构函数

我在整个应用程序中使用 Boost/shared_ptr 指针。当对对象的最后一个引用被释放时,shared_ptr 将为我删除该对象。应用程序中的对象订阅应用程序中心位置的事件,类似于观察者/订阅者模式。

在对象析构函数中,对象将从订阅列表中取消订阅。订阅列表本质上只是一个list<weak_ptr<MyObject> >. 我想做的是与此类似的事情:

我的问题是不能在析构函数中调用 shared_from_this ,所以上面的代码会抛出异常。

在我的旧实现中,订阅列表只是一个指针列表,然后它就起作用了。但我想改用weak_ptr 引用来降低我通过手动内存管理搞砸内存的风险。

由于我依赖 shared_ptr 来执行对象删除,因此我的代码中没有一个地方可以逻辑地调用 Unsubscribe。

关于在这种情况下该怎么做的任何想法?

0 投票
7 回答
4520 浏览

c++ - C++:auto_ptr + 前向声明?

我有这样的课:

在 .cpp 中,构造函数创建一个Innerwith实例,new析构函数创建delete它。这工作得很好。
现在我想更改此代码以使用auto_ptr,所以我写:

现在,构造函数初始化了auto_ptr,析构函数什么也不做。

但它不起作用。当我实例化这个类时,问题似乎出现了。我收到这个警告:

警告 C4150:删除指向不完整类型“内部”的指针;没有调用析构函数

好吧,这显然很糟糕,我理解它为什么会发生,编译器不知道Inner实例化模板时的 d'torauto_ptr<Inner>

所以我的问题是:有没有办法auto_ptr像我在只使用普通指针的版本中那样使用前向声明?
必须对#include我声明的每个类都声明一个指针是一个巨大的麻烦,有时甚至是不可能的。这个问题一般是怎么处理的?