相关疑难解决方法(0)

shared_ptr魔术:)

Lidström先生和我有一个争论 :)

Lidström先生的主张是,构造shared_ptr<Base> p(new Derived);不要求Base有虚拟析构函数:

Armen Tsirunyan:"真的吗?shared_ptr会正确清理吗?在这种情况下你能否证明可以实现这种效果?"

DanielLidström:" shared_ptr使用自己的析构函数来删除Concrete实例.这在C++社区中被称为RAII.我的建议是你学习RAII的全部内容.它将使你的C++编码在使用时更加容易RAII在所有情况下."

Armen Tsirunyan:"我知道RAII,我也知道,当pn达到0时,最终shared_ptr析构函数可能会删除存储的px.但是如果px有静态类型指针Base和动态类型指针Derived,那么除非Base有一个虚拟析构函数,会导致不确定的行为.如果我错了,请纠正我."

DanielLidström:" shared_ptr知道静态类型是Concrete.它知道这个,因为我在它的构造函数中传递它!看起来有点像魔术,但我可以向你保证它是设计上的并且非常好."

所以,判断我们.如何实现shared_ptr而不需要多态类具有虚拟析构函数是否可能(如果是)?提前致谢

c++ destructor smart-pointers

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

默认虚拟机

我们假设我有两个类:

class Base{};

class Derived: public Base{};
Run Code Online (Sandbox Code Playgroud)

没有d tor,在这种情况下如果我声明变量:

Base b;
Derived d;
Run Code Online (Sandbox Code Playgroud)

我的编译器会为我生成,我的问题是,默认的b and d是否是虚拟的?

c++ destructor

9
推荐指数
3
解决办法
1531
查看次数

继承自STL容器

阅读StackOverflow问答这样这个,看起来从STL容器继承通常是一个坏主意.我不打算在生产代码中这样做; 但是,我想知道它是否会给我一个有效的快速和肮脏的测试.

在我们的代码中,我们大量使用STL,我们希望测试如何将内存与64字节边界对齐会影响代码的性能.我打算通过编写一个简单的自定义分配器来测试这个,并且有一个简单的类继承std::vector了类中唯一的变化,即默认分配器是我的自定义分配器而不是std::allocator简单地编写脚本来使用sed和替换所有的实例std::vector和我的新班级.使用这种方法,我将永远不会有任何指针进入基类(所有实例std::vector都已被替换,所以任何指针都将是我的自定义类型),这似乎是从STL继承的最大问题.这是一种有效的方法吗?还有其他更容易/更安全的替代方案吗?这是一个300万行代码库,因此手动更改所有std::vector使用自定义分配器的实例至少可以说是非常非常耗时的任务.

c++ stl

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

标签 统计

c++ ×3

destructor ×2

smart-pointers ×1

stl ×1