草庐IT

weak-template-vtables

全部标签

c++ - 为什么 shared_ptr 需要保存 weak_ptr 的引用计数?

引自C++Primer$12.1.6:Aweak_ptr(Table12.5)isasmartpointerthatdoesnotcontrolthelifetimeoftheobjecttowhichitpoints.Instead,aweak_ptrpointstoanobjectthatismanagedbyashared_ptr.Bindingaweak_ptrtoashared_ptrdoesnotchangethereferencecountofthatshared_ptr.Oncethelastshared_ptrpointingtotheobjectgoesaway,t

c++ - 在什么情况下 vtable 指针可以为空(或 0x1)?

我目前正在调试崩溃日志。发生崩溃是因为(c++-)对象的vtable指针是0x1,而据我从崩溃日志中可以看出,对象的其余部分似乎没问题。程序在尝试调用虚拟方法时崩溃。我的问题:在什么情况下vtable指针可以变为null?operatordelete是否将vtable指针设置为空?这发生在使用gcc4.0.1(AppleInc.build5493)的OSX上。 最佳答案 可能是内存践踏-错误地覆盖了vtable。在C++中有几乎无限多的方法可以“实现”这一点。例如,缓冲区溢出。 关于c+

c++ - vtable:底层算法

我对vtables的理解是,如果我有一个带有虚函数speak()的类Cat,它有子类Lion和HouseCat,则有一个vtable将speak()映射到每个子类的正确实现。于是打个电话cat.speak()编译为cat.vtable[0]()即在vtable位置0进行一次查找,并调用该位置的函数指针。我的问题是:多重继承会怎样?让我们添加一个类Pet。Pet有虚函数speak()和eat()。HouseCat扩展了Pet,而Lion没有。现在,我需要确保pet.eat()编译为pet.vtable[1]()即vtable[0]需要speak()。Pet.eat需要位于slot1。那是

c++ - cppreference 中 atomic_compare_exchange_weak 的示例代码是否正确?

在http://en.cppreference.com/w/cpp/atomic/atomic_compare_exchange,以下示例代码作为std::atomic_compare_exchange_weak的示例使用:voidappend(list*s,node*n){node*head;do{head=s->head;n->next=head;}while(!std::atomic_compare_exchange_weak(s->head,head,n));}我的理解是这个有比较*(s->head)的效果与head,当我认为需要的是比较s->head与head.第一个参数应该

c++ - 如何使用 G++ 抑制纯虚拟类的 C++ vtable 生成?

可以在MSVC中使用__declspec(novtable)属性来抑制C++vtable生成。但是,似乎thereisnoequivalentattribute用于GNUC++编译器。事实上,为纯虚拟类保留vtables会不必要地链接__cxa_abort()和许多其他链接,我想避免这种情况发生,因为我正在为嵌入式系统编程。那么,我该怎么办?structISomeInterface{virtualvoidFunc()=0;};classCSomeClass:publicISomeInterface{virtualvoidFunc();}voidCSomeClass::Func(){//

c++ - 编写编译器 : how to get simple templates to work?

我有一种语法非常类似于C++的语言。词法分析器和解析器就位并产生正确的AST。大部分后端也已完成。编译器用来创建类型的基本系统非常简单:所有类型都被认为是内置的,所有实例都是全局的。所以只有一个简单的映射,它将类型名称与创建Variable的方法相匹配,该Variable基本上是像boost::any这样的通用类型。另一个以变量名作为键,变量作为值的映射作为全局范围:std::maptypeList;//registersometypestypeList["X"]=Variable::Create;typeList["Y"]=CreateInstanceOfY;....当编译器获取用于

c++ - Clang -Wweak-vtables 和纯抽象类

关于之前关于此主题的问题:这是对我最近提出的问题的跟进:clang:noout-of-linevirtualmethoddefinitions(pureabstractC++class)并且被标记为这个问题的重复项:Whatisthemeaningofclang's-Wweak-vtables?.我认为这并没有回答我的问题,所以在这里我将重点放在令我困惑且尚未得到解答的事情上。我的场景:我正在尝试使用Clang-3.5编译以下简单的C++代码:测试.h:classA{public:A();virtual~A()=0;};测试.cc#include"test.h"A::A(){;}A::

c++ - 默认模板参数 : Why does the compiler complain about not specifying template argument?

我有这个代码:structA{};templatestructB{voidfoo(){}};Bb;//Error:missingtemplateargumentsbefore'b'//Error:expected';'before'b'//Moreerrorsb.foo()如果我将foo()作为具有相同模板“签名”的模板函数,编译器不会提示没有指定模板参数:structA{};structB{templatevoidfoo(){}};Bb;//OKb.foo()那么为什么我需要为带有默认参数的模板类指定参数,而不是为模板函数指定参数呢?我是否遗漏了一些微妙之处?原因肯定是因为模板参数推

c++ - 缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义

我很确定这个问题是重复的,但我的代码在这里不同,以下是我的代码。它因“undefinedsymbol”错误而失败,不确定缺少什么。classParent{public:virtualintfunc()=0;virtual~Parent();};classChild:publicParent{public:intdata;Child(intk){data=k;}intfunc(){//virtualfunctioncout以下是编译时的O/PUndefinedsymbolsforarchitecturex86_64:"Parent::~Parent()",referencedfrom:C

c++ - 一旦对 std::weak_ptr 的锁定返回了 nullptr,它还能再次为非空吗?

如果你锁定std::weak_ptr:classfoo{};autos=std::make_shared();std::weak_ptrw{s};s=nullptr;s.reset(newfoo());autol=w.lock();//trytogetpreviousfoostd::cout输出:locked:0一旦lock返回nullptr,是否存在它可以返回非null的条件,或者它实际上已经死了?我的测试程序建议,一旦最初分配的对象的引用计数为零,则不会,weak_ptr将始终返回nullptr。 最佳答案 isthereeve