gpt4 book ai didi

c++ - 在构造函数中出现异常之前分配的内存没有被释放

转载 作者:行者123 更新时间:2023-11-28 06:47:19 24 4
gpt4 key购买 nike

 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 constructor\n";
}
}
void show()
{
cout<<*d<<endl<<ch;
}
};
main()
{
book b;
b.show();
}

当构造函数出现异常时,我们应该释放分配的内存以避免内存泄漏。但是在上面的代码中,我试图释放分配的内存,即使这样它也显示了正确的答案,即 * 的值d显示为23,为什么会这样?

最佳答案

在指针被删除后使用它的指称是未定义的行为。

该值未被清除或更改并非不正常。但如果被清除或改变也不会不自然。如果程序崩溃,那也不是不自然的。


在其他新闻中...

抛出 char 或其他基本值可能会导致麻烦,或者至少会阻止记录合适的消息。通常期望是从 std::exception 派生的异常,例如std::runtime_errorstd::system_error

在构造函数中捕获异常本身是可以的,但是当构造函数失败时不抛出异常是灾难的邀请——实例化代码将留下一个无效的对象。

为了便于在失败的构造函数中进行清理,请使用智能指针、标准集合类或自定义 RAII(在适当定义的类型的析构函数中进行清理)。

在 C++ 中声明没有结果类型的 main 是无效的,它从不支持隐式 int

关于样式,public:book() 看起来像是应用于单个项目的访问说明符,如在 Java 和 C# 中一样。在 C++ 中,访问说明符以给定的访问权限开始一个区域。因此,在视觉上将它与一个单一的东西结合起来是不自然的。

关于c++ - 在构造函数中出现异常之前分配的内存没有被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24729621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com