C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
您是否必须传递删除new返回的相同指针,或者您可以将指针传递给其中一个类基类型?例如:
class Base
{
public:
virtual ~Base();
...
};
class IFoo
{
public:
virtual ~IFoo() {}
virtual void DoSomething() = 0;
};
class Bar : public Base, public IFoo
{
public:
virtual ~Bar();
void DoSomething();
...
};
Bar * pBar = new Bar;
IFoo * pFoo = pBar;
delete pFoo;
Run Code Online (Sandbox Code Playgroud)
当然,这大大简化了.我真正想要做的是创建一个充满boost :: shared_ptr的容器,并将其传递给一些代码,这些代码在完成后将从容器中删除它.这段代码对Bar或Base的实现一无所知,并且依赖于shared_ptr析构函数中隐含的delete运算符来做正确的事情.
这可能有用吗?我的直觉说不,因为指针不会有相同的地址.另一方面,dynamic_cast <Bar*>应该可以工作,所以编译器正在存储足够的信息来解决它.
mov eax, DWORD PTR _this$[ebp]
Run Code Online (Sandbox Code Playgroud)
跟踪汇编程序显示这是传递给delete函数的指针.谜团已揭开.
我已经修复了将虚拟析构函数添加到IFoo的示例,这是一个简单的疏忽.再次感谢所有指出的人.
可能的重复:
何时使用虚拟析构函数?
如果一个类(具有虚函数)及其继承类的所有数据成员都是非指针类型(意味着它不能保存任何动态内存),是否需要将析构函数声明为虚函数?
例子
class base {
int x;
public:
virtual void fn(){}
};
class der: public base {
int y;
public:
void fn(){}
};
Run Code Online (Sandbox Code Playgroud)
这里我们需要一个虚拟析构函数吗?