构造函数和析构函数

时间:2013-07-09 14:37:36

标签: c++ constructor eclipse-cdt destructor

我有以下代码,据我所知,在使用类构造函数的程序结束时,如果创建了某些对象,它们就会被销毁。由此判断,在执行结束时我应该有一些“~B()”和“~D()”按特定顺序打印出来,但是当我运行代码时没有发生。为什么?

#include<iostream>
#include<stdlib.h>
using namespace std;

class B{
public:
    B(){cout<<"B()";}
    virtual void print(){cout<<"b";}
    ~B(){cout<<"~B()";}
};

class D:public B{
public:
    D(){cout<<"D()";}
    void print(){B::print()
    ;cout<<"d";}
    ~D(){cout<<"~D()";}
    };

void testI(){
    B* b[]={new B(),new D()};
    b[1]->print();
    B&c=*b[1];
    c.print();
}



int main(){
    testI();
return 0;
}

4 个答案:

答案 0 :(得分:3)

您正在使用new创建对象,这意味着它们是在堆上而不是堆栈中分配的,因此您可以删除它们。

B * b = new B();

稍后......

delete b;

编辑:

对于数组使用:

delete[] b; //if b is a pointer to an array of B's

答案 1 :(得分:2)

因为您使用动态分配。为此,你有责任摧毁你分配的东西。

在这里阅读新的和删除: http://www.cplusplus.com/reference/new/

答案 2 :(得分:0)

您使用new来分配动态内存而不删除对象。虽然您可以通过添加删除语句来解决这个问题,但随着代码变得越来越复杂,您会发现手动内存管理可能变得难以处理且容易出错。

使用std::unique_ptrstd::shared_ptr等自动内存管理类,并使用像std::vector这样的容器类,你会好得多。

void testI()
{
    std::vector<std::shared_ptr<B>> b = {std::make_shared<B>(), std::make_shared<D>()};
    b[1]->print();
    B& c= *b[1];
    c.print();
} //b is destroyed here

答案 3 :(得分:0)

在常态中:

  

3.6.1.5 - main中的return语句具有离开main函数的效果   (销毁具有自动存储持续时间的任何对象)

因此,在您的程序中,您创建了几个变量。从main返回时,只有具有自动存储持续时间的那些被销毁。具有动态存储持续时间的那些不是。对于具有动态存储持续时间的变量,您必须明确调用delete

这是一个小例子。在析构函数中放置一个断点并检查m_name值。

#include <iostream>
#include <string>

class A
{
public:
    A(const std::string &name):m_name(name){}

    ~A()
    {
        std::cout<<"deleting "<<m_name<<std::endl;
    }

private:
    std::string m_name;
};

A a("Variable at namespace scope");

int main()
{
    A a0("Automatic storage"); 
    A *a1 = new A("Dynamic storage 1"); 
    A *a2 = new A("Dynamic storage 2"); 
    delete a2;
    static A a3("Static storage");

    return 0;
}