我理解如何使用weak_ptr和shared_ptr.我shared_ptr通过计算其对象中的引用数来理解它是如何工作的.weak_ptr工作怎么样?我尝试阅读boost源代码,并且我不熟悉boost以了解它使用的所有内容.
谢谢.
这是在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)
编辑:重命名变量名称和更改的代码更正确.
我正在为我的学生项目的游戏引擎开发一个共享指针(称为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) 我发现了这篇文章,其中一个答案是@kerek SB说的
Run Code Online (Sandbox Code Playgroud)std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo"));在你的代码中,第二个变量只是一个裸指针,而不是一个共享指针.
现在就肉了.make_shared(实际上)更有效,因为它在一个动态分配中将引用控制块与实际对象一起分配.相比之下,采用裸对象指针的shared_ptr的构造函数必须为引用计数分配另一个动态变量.权衡是make_shared(或其表兄allocate_shared)不允许您指定自定义删除器,因为分配是由分配器执行的.
(这不会影响对象本身的构造.从Object的角度来看,两个版本之间没有区别.更有效的是共享指针本身,而不是托管对象.)
现在我对这篇文章有两个问题,如果有人能澄清一下,我会很感激
为什么第二个不是共享指针?这不会增加引用计数
make_shared如何只进行一次内存分配,而new将两次内存分配,从而使make_shared更有效率?
对此有点澄清将不胜感激.
如果我们有一些智能指针类,它可以接受任意对象并提供引用计数指针,那么我们如何实际存储对引用进行计数的整数?引用计数必须在指向同一对象的智能指针类的所有实例之间共享。
我想到的一种解决方案是将引用计数存储在我们指向的对象中,但这对于一般解决方案来说并不是很好,因为每个对象都必须提供引用计数本身或从提供引用计数的某个对象继承它。
c++ ×6
shared-ptr ×3
boost ×1
c++11 ×1
make-shared ×1
pointers ×1
struct ×1
tr1 ×1
weak-ptr ×1
x86 ×1