相关疑难解决方法(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万
查看次数

C++中的虚拟默认析构函数

我有一大组继承的类(条件)继承自基类(标准).这criterion是代码

class criterion
{
public:
    virtual unsigned __int32 getPriorityClass() const = 0;
    virtual BOOL include(fileData &file) const = 0;
    virtual void reorderTree() = 0;
    virtual unsigned int directoryCheck(const std::wstring& directory) const = 0;
    virtual std::wstring debugTree() const = 0;
};
Run Code Online (Sandbox Code Playgroud)

这个派生类的一些例子:

class fastFilter : public criterion
{
public:
    void reorderTree() {};
    unsigned int  directoryCheck(const std::wstring& /*directory*/) const { return DIRECTORY_DONTCARE; };
    unsigned __int32 getPriorityClass() const { return PRIORITY_FAST_FILTER; };
};

class isArchive : public fastFilter
{
public:
    BOOL …
Run Code Online (Sandbox Code Playgroud)

c++ virtual-destructor

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

从C++ 11中的STL容器继承

我一直在考虑从C++ 11中继承STL容器.我知道如果没有一些考虑因素就不应该这样做,因为没有虚拟析构函数.

根据我的理解,使用typedef是为STL容器命名的首选方法.

但是,typedef本身并非没有问题.首先,它们不能轻易地向前声明,并且两个typedef可能意外地是相同的类型.

请考虑以下事项:

typedef std::vector<int> vec_a_t;
typedef std::vector<float> vec_b_t;

void func(const vec_a_t& v);
void func(const vec_b_t& v);
Run Code Online (Sandbox Code Playgroud)

这两个函数的行为应根据逻辑类型vec_a_t或不同而有所不同vec_b_t

这种情况将正常工作,直到有人改变vec_a_t

typedef std::vector<float> vec_a_t;
Run Code Online (Sandbox Code Playgroud)

现在打电话func()突然变得含糊不清.一个现实的例子func()

std::ostream& operator<<(std::ostream& ost, const vec_a_t& v);
Run Code Online (Sandbox Code Playgroud)

现在,如果我们改为继承

class Vector : public std::vector<int>
{};

std::ostream& operator<<(std::ostream& ost, const Vector& v);
Run Code Online (Sandbox Code Playgroud)

也可以宣布

class Vector2 : public std::vector<int> {};

std::ostream& operator<<(std::ostream& ost, const Vector2& v);
Run Code Online (Sandbox Code Playgroud)

这显然是消除歧视.

但是,因为std::vector没有从它们派生的虚拟析构函数,所以这是错误的并且可能导致问题.

相反,我们尝试

class Vector : private std::vector<int>
{
public:
   using::size;
   //Add …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance stl vector c++11

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