相关疑难解决方法(0)

weak_ptr如何工作?

我理解如何使用weak_ptrshared_ptr.我shared_ptr通过计算其对象中的引用数来理解它是如何工作的.weak_ptr工作怎么样?我尝试阅读boost源代码,并且我不熟悉boost以了解它使用的所有内容.

谢谢.

c++ boost weak-references tr1 weak-ptr

57
推荐指数
1
解决办法
2万
查看次数

共享指针如何工作?

共享指针如何知道有多少指针指向该对象?(在这种情况下,shared_ptr)

c++ shared-ptr c++11

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

变量大小的Struct C++

这是在C++中制作可变大小结构的最佳方法吗?我不想使用vector,因为初始化后长度不会改变.

struct Packet
{
    unsigned int bytelength;
    unsigned int data[];
};

Packet* CreatePacket(unsigned int length)
{
    Packet *output = (Packet*) malloc((length+1)*sizeof(unsigned int));
    output->bytelength = length;
    return output;
}
Run Code Online (Sandbox Code Playgroud)

编辑:重命名变量名称和更改的代码更正确.

c++ struct variable-length

20
推荐指数
4
解决办法
2万
查看次数

x86/C++ - 指针指针:编译器违反了const?

我正在为我的学生项目的游戏引擎开发一个共享指针(称为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)

c++ x86 shared-ptr visual-studio-2013

9
推荐指数
1
解决办法
230
查看次数

new和make_shared用于共享指针

我发现了这篇文章,其中一个答案是@kerek SB说的

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
Run Code Online (Sandbox Code Playgroud)

在你的代码中,第二个变量只是一个裸指针,而不是一个共享指针.

现在就肉了.make_shared(实际上)更有效,因为它在一个动态分配中将引用控制块与实际对象一起分配.相比之下,采用裸对象指针的shared_ptr的构造函数必须为引用计数分配另一个动态变量.权衡是make_shared(或其表兄allocate_shared)不允许您指定自定义删除器,因为分配是由分配器执行的.

(这不会影响对象本身的构造.从Object的角度来看,两个版本之间没有区别.更有效的是共享指针本身,而不是托管对象.)

现在我对这篇文章有两个问题,如果有人能澄清一下,我会很感激

  1. 为什么第二个不是共享指针?这不会增加引用计数

  2. make_shared如何只进行一次内存分配,而new将两次内存分配,从而使make_shared更有效率?

对此有点澄清将不胜感激.

c++ pointers shared-ptr make-shared

6
推荐指数
2
解决办法
3050
查看次数

对象的引用计数通常存储在哪里?

如果我们有一些智能指针类,它可以接受任意对象并提供引用计数指针,那么我们如何实际存储对引用进行计数的整数?引用计数必须在指向同一对象的智能指针类的所有实例之间共享。

我想到的一种解决方案是将引用计数存储在我们指向的对象中,但这对于一般解决方案来说并不是很好,因为每个对象都必须提供引用计数本身或从提供引用计数的某个对象继承它。

c++ smart-pointers

2
推荐指数
1
解决办法
1111
查看次数