我现在正在研究一个简单的继承类来练习测试,而我似乎无法弄清楚如何删除其中一个对象。代码如下:
#include <iostream>
#include <string>
using namespace std;
class Human
{
public:
void speakNicely();
void speakRudely();
int getAge();
void setAge(int x);
Human();
~Human();
private:
int age;
};
Human::Human(){}
Human::~Human(){}
void Human::speakNicely()
{
}
void Human::speakRudely()
{
}
void Human::setAge(int x)
{
age = x;
}
int Human::getAge()
{
return age;
}
////////////////////////////////////
class AlienObserver: public Human
{
public:
AlienObserver();
~AlienObserver();
};
AlienObserver::AlienObserver(){}
AlienObserver::~AlienObserver(){}
int main()
{
cout<<"TEST"<<endl;
Human Todd;
Todd.setAge(11);
cout<<Todd.getAge()<<endl;
Todd.speakNicely();
Todd.speakRudely();
AlienObserver Todderick;
Todderick.setAge(15);
cout<<Todderick.getAge()<<endl;
Todderick.speakNicely();
delete Todderick; //problem line/////////////////////
return 0;
}
当我尝试删除Todderick对象时,我收到一条错误,指出编译器正在指向一个指针。我做错了什么?
答案 0 :(得分:4)
这是因为delete
接受new
返回的指针并销毁指针所指向的对象。更具体地说,它只 那个。除了上面描述的指针(或nullptr
)到delete
之外的任何其他内容都是未定义的行为。
具有自动存储的变量(例如Todderick
)不需要手动销毁,它会在其生命周期结束后自动发生(即程序流存在于定义变量的范围之后)。
答案 1 :(得分:0)
operator delete将指针作为参数
void operator delete ( void* ptr );
但是你试着给它一个对象
AlienObserver Todderick;
这是错误的。您不能在C ++中对具有自动存储持续时间的对象调用delete。它们将在其范围的末尾被删除,即它们在程序中的可见性区域的末尾。
{
//...
AlienObserver Todderick;
Todderick.setAge(15);
cout<<Todderick.getAge()<<endl;
Todderick.speakNicely();
//...
return 0;
} // here Toderick is deleted automatically and it's
// destructor is called as well
此外,每次删除调用都必须匹配之前调用的new
。您只能通过拨打delete
时收到的指针调用new
。最后,它必须始终是对delete
的适当形式的调用。
void* operator new ( std::size_t count );
--> void operator delete ( void* ptr );
void* operator new[]( std::size_t count );
--> void operator delete [] ( void* ptr );