相关疑难解决方法(0)

为什么我的析构函数从未被调用过?

我有一个基类A和一个派生类B:

class A
{
public:
    virtual f();
};

class B : public A
{
public:
     B()
     {
         p = new char [100];
     }
     ~B()
     {
         delete [] p;
     }
     f();
private:
    char *p;
};
Run Code Online (Sandbox Code Playgroud)

出于任何原因,析构函数永远不会被调用 - 为什么?我不明白这一点.

c++ memory-leaks

12
推荐指数
2
解决办法
6027
查看次数

clang&gcc在使用智能指针时不会警告非虚拟基础析构函数的多态性?

我们知道如果有虚函数那么基类析构函数也应该被标记为虚拟,否则当显式地deleted使用基类指针时它是未定义的行为如果我们希望删除带有基类指针的派生对象,则基础析构函数应该被标记为虚拟,否则是未定义的行为.

例如,

struct Base {
  virtual void greet() { std::cout << "base\n"; }
};

struct Derived : public Base {
  virtual void greet() override { std::cout << "derived\n"; }
};
Run Code Online (Sandbox Code Playgroud)

呼叫

Base *b = new Derived;
b->greet();
delete (b);
Run Code Online (Sandbox Code Playgroud)

-wdelete-non-virtual-dtor时,clang(类似gcc)会发出这样的警告:

delete called on 'Base' that has virtual functions but non-virtual destructor
Run Code Online (Sandbox Code Playgroud)

但他们都没有报告智能指针的警告:

std::unique_ptr<Base> sb = std::make_unique<Derived>();
//   std::unique_ptr<Base> sb = std::unique_ptr<Derived>(new Derived);
sb->greet();
Run Code Online (Sandbox Code Playgroud)

我想这仍然导致未定义的行为,对吧?

c++ smart-pointers unique-ptr virtual-destructor c++11

10
推荐指数
2
解决办法
1806
查看次数