在构造函数中出现异常之前分配的内存没有被释放
memory is not getting freed up which was allocated before there arises an exception in constructor
class book
{
int*d;
char ch;
public:book()
{
try
{
d=new int(23);
throw 'A';
ch='B';
}
catch(char c)
{
delete d;
cout<<"caught exception in constructorn";
}
}
void show()
{
cout<<*d<<endl<<ch;
}
};
main()
{
book b;
b.show();
}
当构造函数中出现异常时,我们应该释放分配的内存以避免内存泄漏。但是在上面的代码中,我试图释放分配的内存,即使这样它也显示正确的答案,即*d的值显示为23。为什么会这样呢? 在指针被删除后再使用指针是未定义行为。
该值未被清除或更改并不是不自然的。但如果被清除或改变,也不是不自然的。如果程序崩溃了,不管怎样,也不是不自然的。
在其他新闻中…
抛出char
或其他基本值可能会引起麻烦,或者至少会阻止记录合适的消息。通常期望是std::exception
的例外,例如std::runtime_error
或std::system_error
。
在构造函数中捕获异常本身是可以的,但在构造函数失败时不抛出异常则会招致灾难–实例化代码将留下一个无效的对象。
为了方便在失败的构造函数中进行清理,可以使用智能指针、标准集合类或自定义的RAII(在适当定义类型的析构函数中进行清理)。
没有结果类型的声明main
在c++中是无效的,因为c++不支持隐式int
。
关于样式,public:book()
看起来像应用于单个项目的访问说明符,就像在Java和c#中一样。在c++中,访问说明符用给定的访问开始一个区域。因此,将它与一个单独的东西结合在一起是不自然的。
相关文章:
- 包含矢量指针的结构的内存释放问题
- Valgrind 声称内存释放中的自由空间太多
- 当 C 和 C++ 中严格要求内存释放时
- C++ 中指针变量的内存释放
- 德克内存释放
- 临时对象 c++ 的内存释放
- C 全局对象变量内存释放
- C++矢量动态内存释放/删除
- 从 cv::Mat 初始化的 IplImage 的内存释放
- SWIG类型映射中的内存释放
- STL容器中的内存释放
- QWebView内存释放
- 内存释放 C++
- 大返回值(如字符串)的内存释放如何在C++中发生
- 重新分配之前的内存释放
- Linux C++ 中的内存释放
- VS2012编译器奇怪的内存释放问题
- 调试断言失败!错误的内存释放
- 负责 COM 互操作中的内存释放
- imread命令后OpenCV矩阵内存释放