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