C++析构函数以释放内存
C++ Destructors to release memory
#include<iostream>
#include<string>
using namespace std;
class Human{
private:
int *age;
string *name;
public:
Human(string iname,int iage)
{
name=new string;
age=new int;
*name=iname;
*age=iage;
}
void display()
{
cout<<"Name "<<*name<<endl<<"Age "<<*age<<endl;
}
~Human(){
delete name;
delete age;
cout<<"Released all memories"<<endl;
}
};
int main()
{
Human *pallavi= new Human("pallavi",21);
pallavi->display();
delete pallavi;
pallavi->display();
return 0;
}
我编写了一个简单的程序来创建类 Human 的对象。指定析构函数以删除两个数据变量,即 int age 和字符串名称。但是在调用析构函数("删除 pallavi")并再次显示变量时,我收到的输出是:
姓名年龄
21
当然,整个输出是这样的:
姓名 帕拉维
21岁 释放所有记忆
姓名
21
岁。
我的问题是,析构函数不应该释放记忆吗?这不应该意味着在第二次显示对象时(在调用析构函数之后),名称和年龄应该显示垃圾值吗?为什么输出没有显示"名称"和"年龄"21 的值?
析构函数正在做它应该做的事情,但是在你delete
它之后使用指针pallavi
的行为是不确定的。
编译器可以执行任何操作,包括打印某些对象。它也可能吃掉你的猫。
大概您只是在类中使用指针成员作为练习。"实际上"这样做对int
和std::string
毫无意义,甚至是有害的:你的类的实例不再是微不足道的可复制的。
您指的是已被删除的内存,这就是C++中所谓的未定义行为。
C++ 不会在从堆中删除内存时将其设置为零。
删除后,ptr 指向的对象处于未定义状态。在再次将有效对象的地址分配给 ptr 之前,访问它是未定义的 beavior。
相关文章:
- 包含矢量指针的结构的内存释放问题
- Valgrind 声称内存释放中的自由空间太多
- 当 C 和 C++ 中严格要求内存释放时
- C++ 中指针变量的内存释放
- 德克内存释放
- 临时对象 c++ 的内存释放
- C 全局对象变量内存释放
- C++矢量动态内存释放/删除
- 从 cv::Mat 初始化的 IplImage 的内存释放
- SWIG类型映射中的内存释放
- STL容器中的内存释放
- QWebView内存释放
- 内存释放 C++
- 大返回值(如字符串)的内存释放如何在C++中发生
- 重新分配之前的内存释放
- Linux C++ 中的内存释放
- VS2012编译器奇怪的内存释放问题
- 调试断言失败!错误的内存释放
- 负责 COM 互操作中的内存释放
- imread命令后OpenCV矩阵内存释放