我遇到使用多态的问题。 代码在这里:
$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;不能被摧毁或在某个地方我可能是错的。感谢。
答案 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