1

我有以下代码,据我所知,在使用类构造函数的程序结束时,如果创建了某些对象,它们就会被销毁。据此判断,在执行结束时我应该有一些“~ 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

4 回答 4

3

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

B * b = new B();

稍后的..

delete b;

编辑:

对于数组使用:

delete[] b; //if b is a pointer to an array of B's
于 2013-07-09T14:39:59.150 回答
2

因为你使用动态分配。为此,您有责任销毁您分配的内容。

在此处阅读有关新建和删除的信息: http ://www.cplusplus.com/reference/new/

于 2013-07-09T14:39:44.417 回答
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
于 2013-07-09T14:54:01.430 回答
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;
}
于 2013-07-09T15:01:48.620 回答