我正在使用gcc编译器的平台上工作,但是boost无法在其上编译.
我想知道在gcc的std:tr1中包含shared_ptr的正确方法是什么?我查看的文件说不要直接包含它,我可以告诉其他任何文件都不包含它:|
我曾与之合作的人曾说过,shared_ptr是不安全的,并且会在从派生类转换为基类时进行切片(即向上转换).例如,如果有两个A和B类,其中B来自A,那么
shared_ptr<A> a(new B)
Run Code Online (Sandbox Code Playgroud)
会切片.我指着他http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm 在那里说
shared_ptr<T>可以隐式转换到shared_ptr<U>每当T*可以隐式转换到U*.
暗示在这些情况下使用是安全的,但他似乎并不这么认为.
很抱歉,如果在某处明确回答这个问题,但我对我在线阅读的文档和文章感到有些困惑.
我看到我可以使用reset()函数释放shared_ptr中的内存(假设引用计数变为零),例如,
shared_ptr<int> x(new int(0));
x.reset(new int(1));
Run Code Online (Sandbox Code Playgroud)
我相信这会导致创建两个整数对象,并且在这两行的末尾,将从内存中删除等于零的整数.
但是,如果我使用以下代码块怎么办:
shared_ptr<int> x(new int(0));
x = shared_ptr<int>(new int(1));
Run Code Online (Sandbox Code Playgroud)
显然,现在*x == 1是真的,但原始整数对象(等于零)是从内存中删除还是我泄漏了那个内存?
在我看来,这将是赋值运算符减少shared_ptr的引用计数的问题,但是对源代码的一瞥似乎并不能解决我的问题.希望有经验或知识渊博的人可以帮助我.提前致谢.
我只是在即将推出的新c ++标准中使用智能指针.但是我没有掌握shared_from_this函数的用法.这是我有的:
#include <iostream>
#include <memory>
class CVerboseBornAndDie2 : public std::enable_shared_from_this<CVerboseBornAndDie2>
{
public:
std::string m_Name;
CVerboseBornAndDie2(std::string name) : m_Name(name)
{
std::cout << m_Name << " (" << this << ") is born!" << std::endl;
}
virtual ~CVerboseBornAndDie2()
{
std::cout << m_Name << " (" << this << ") is dying!" << std::endl;
}
};
int main(){
CVerboseBornAndDie2* vbad = new CVerboseBornAndDie2("foo");
std::shared_ptr<CVerboseBornAndDie2> p = vbad->shared_from_this();
}
Run Code Online (Sandbox Code Playgroud)
它会在行中抛出一个std :: bad_weak_ptr异常
std::shared_ptr<CVerboseBornAndDie2> p = vbad->shared_from_this();
Run Code Online (Sandbox Code Playgroud)
如果我反而这样做
std::shared_ptr<CVerboseBornAndDie2> p(vbad);
Run Code Online (Sandbox Code Playgroud)
它有效,我可以事后做
std::shared_ptr<CVerboseBornAndDie2> p2 = …Run Code Online (Sandbox Code Playgroud) 有没有人在发布模式版本中测试过这个?或者实现如此相似,没有显着差异?
我对速度感兴趣:
创建一个新的shared_ptr
创建shared_ptr的副本
取消引用指针以访问指针对象
这将是针对速度优化的发布版本,使用make_shared()创建新的shared_ptrs
在以下行
class Symbol : public boost::enable_shared_from_this<Symbol> {
我收到错误:
错误:无效使用不完整类型struct boost::enable_shared_from_this<Symbol>
/usr/include/boost/smart_ptr/shared_ptr.hpp:63:错误:声明struct boost::enable_shared_from_this<Symbol>
知道为什么我会收到这个错误.符号是一个抽象类(如果重要的话)
我正在为我的学生项目的游戏引擎开发一个共享指针(称为Handle)实现,我们遇到了一个我们无法解释的错误.出于某种原因,在我们工厂的某个点上,有一个无效的内部指针通过句柄传递给工厂,这在我们的原型加载过程中导致了崩溃.我们通过这个过程进行了几个小时的调试,并将任何复杂的语句分解为最简单的版本,以便于调试.我终于将问题分解为Handle类的复制构造函数.但是,似乎还有一些中间步骤,其中内部指针被释放.我阅读了有关可能导致此问题的所有文章,但没有找到任何内容.最后,我决定查看反汇编,看看能否弄清楚发生了什么.这是没有反汇编的复制构造函数.
template <class TYPE>
Handle<TYPE>::Handle(const Handle<TYPE>& rhs, bool weak) : m_weak(weak), m_ref_count(rhs.m_ref_count), m_ptr(rhs.m_ptr)
{
if(!m_weak)
++(*m_ref_count);
}
Run Code Online (Sandbox Code Playgroud)
这是带有反汇编的复制构造函数.
template <class TYPE>
Handle<TYPE>::Handle(const Handle<TYPE>& rhs, bool weak) : m_weak(weak), m_ref_count(rhs.m_ref_count), m_ptr(rhs.m_ptr)
{
013FFF50 push ebp
013FFF51 mov ebp,esp
013FFF53 sub esp,0CCh
013FFF59 push ebx
013FFF5A push esi
013FFF5B push edi
013FFF5C push ecx
013FFF5D lea edi,[ebp-0CCh]
013FFF63 mov ecx,33h
013FFF68 mov eax,0CCCCCCCCh
013FFF6D rep stos dword ptr es:[edi]
013FFF6F pop ecx
013FFF70 mov dword ptr [this],ecx
013FFF73 mov eax,dword ptr [this] …Run Code Online (Sandbox Code Playgroud) 如何在构造函数的初始化列表中初始化共享指针?
我有这个:
Foo::Foo (const callback &cb)
{
Bar bar;
bar.m_callback = cb;
m_ptr = std::make_shared<Bar>(bar);
//...
}
Run Code Online (Sandbox Code Playgroud)
我想把它放到构造函数的初始化列表中.就像是:
Foo::Foo (const callback &cb) :
m_ptr(std::make_shared<Bar>(?????))
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
酒吧是struct:
struct Bar
{
callback_type m_callback;
// etc.
};
Run Code Online (Sandbox Code Playgroud) 我刚刚编写了一个测试程序,以找到分配和释放许多管理对象的最快方法shared_ptr.
我试图shared_ptr用new,shared_ptr用pool,make_shared,allocate_shared.是什么让我感到惊讶的allocate_shared是慢shared_ptr用pool.
我vs2017+win10用发布版本测试代码.发布版本设置为默认值(/ O2).我也测试它gcc4.8.5+centos6.2与g++ -std=c++11 -O3.
代码是:
#include <memory>
#include <iostream>
#include <vector>
#include <assert.h>
#include <chrono>
#include <mutex>
using namespace std;
struct noncopyable {
protected:
noncopyable() = default;
~noncopyable() = default;
private:
noncopyable(const noncopyable&) = delete;
noncopyable& operator=(const noncopyable&) = delete;
noncopyable(noncopyable&&) = delete;
noncopyable& operator=(noncopyable&&) = delete;
};
class BlockPool : noncopyable …Run Code Online (Sandbox Code Playgroud) 我有一个函数需要共享一个参数的所有权,但不修改它。我已将参数设为 shared_ptr<const T> 以清楚地传达此意图。
template <typename T>
void func(std::shared_ptr<const T> ptr){}
Run Code Online (Sandbox Code Playgroud)
我想将此函数与 shared_ptr 调用到非常量 T。例如:
auto nonConstInt = std::make_shared<int>();
func(nonConstInt);
Run Code Online (Sandbox Code Playgroud)
但是,这会在 VC 2017 上生成编译错误:
error C2672: 'func': no matching overloaded function found
error C2784: 'void func(std::shared_ptr<const _Ty>)': could not deduce template argument for 'std::shared_ptr<const _Ty>' from 'std::shared_ptr<int>'
note: see declaration of 'func'
Run Code Online (Sandbox Code Playgroud)
有没有办法让这项工作没有:
我们目前正在根据 C++14 标准进行编译,如果有帮助,我们计划很快迁移到 C++17。
c++ ×10
shared-ptr ×10
c++11 ×4
boost ×3
c++14 ×1
constructor ×1
gcc ×1
performance ×1
tr1 ×1
visual-c++ ×1
x86 ×1