为什么不能在多态C ++中破坏类

时间:2015-06-04 16:04:24

标签: c++ inheritance polymorphism

我遇到使用多态的问题。 代码在这里:

$toreboot = @()
$rebooted = @()
[timespan]$recentboot = new-timespan $(get-date).AddHours(-10) $(get-date)
[timespan]$needboot = new-timespan $(get-date) $(get-date).Adddays(30) 

$recentboot
$needboot

$names = Get-Content "d:\scrap\servers.txt"
foreach ($name in $names)
  {
    if ( Test-Connection -ComputerName $name -Count 1 -ErrorAction     SilentlyContinue ) 
              {
                $wmi = gwmi -class Win32_OperatingSystem -computer $name
                $LBTime = $wmi.ConvertToDateTime($wmi.Lastbootuptime)
                [TimeSpan]$uptime = New-TimeSpan $LBTime $(get-date)
                Write-output "$name Uptime is  $($uptime.days) Days $($uptime.hours) Hours $($uptime.minutes) Minutes $($uptime.seconds) Seconds"
                if ($uptime -lt $recentboot)
                    {$rebooted += $names}
                if($uptime -gt $needboot)
                    {$toreboot += $name}

               }
     else {
        Write-output "$name is not pinging"
          }

          if ($toreboot -ne $null)
            {set-content -Path "d:\scrap\serverstoboot.txt" -Value $toreboot}
          if ($rebooted -ne $null)
            {set-content -Path "d:\scrap\recentlybooted.txt" -value $rebooted}
    }

结果是:

class A {
public:
    A() {cout << "construct a" << endl;}
    virtual ~A() {cout << "destroy a" << endl;}
};

class B : public A{
public:
    B() {cout << "construct b" << endl;}
    ~B() {cout << "destroy b" << endl;}
};
void main() {
    A *p = new B;
}

为什么&#39; p&#39;不能被摧毁或在某个地方我可能是错的。感谢。

5 个答案:

答案 0 :(得分:3)

您需要调用

delete p;

删除指针并调用析构函数。动态分配的对象没有自动调用它们的析构函数,这就是你需要调用delete运算符的原因,它首先调用析构函数然后调用operator delete来释放内存。

答案 1 :(得分:0)

因为您正在使用new运算符分配数据。如果要调用析构函数,请确保使用

删除指针
delete p;

答案 2 :(得分:0)

您也可以将p声明为std::unqiue_ptr<A> p(new B); - 唯一指针将删除范围末尾的指针。

答案 3 :(得分:0)

通过使用普通指针,您已经说过要自己管理对象的生命周期。既然你从未说过要破坏对象(delete p;会这样做,只要p指向对象),它就永远不会被破坏。

通常,您应该自动管理对象的生命周期。两个基本工具是:

std::unique_ptr<A> p { new B };

使用unique_ptr时,只允许一个指针“拥有”该对象。当该指针消失时,它指向的对象将自动被销毁。另一个工具是

std::shared_ptr<A> p { new B };
// or p = make_shared<B>();

多个共享指针可以“共享”对象的所有权。当所有共享指针都消失后,该对象将被自动销毁。

答案 4 :(得分:0)

对new的调用会在堆上分配内存。您需要使用delete运算符明确地处理此内存。否则会导致可怕的内存泄漏。由于这是常见的错误来源,您可能有兴趣使用std::unique_ptr boost::scoped_ptr