我将如何删除此类对象? (C ++)

时间:2014-12-14 22:21:09

标签: c++ class object

我现在正在研究一个简单的继承类来练习测试,而我似乎无法弄清楚如何删除其中一个对象。代码如下:

#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对象时,我收到一条错误,指出编译器正在指向一个指针。我做错了什么?

2 个答案:

答案 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 );