c++基本异常问题
C++ basic exception question
谁能描述一下处理以下情况的正确方法?
wchar_t* buffer = new wchar_t[...];
if (!something)
{
throw std::runtime_error("Whatever");
// Now, at this point I'm leaking memory allocated for the 'buffer'.
}
// Perform actions.
delete[] buffer;
最明显的解决方法是:
if (!something)
{
delete[] buffer;
throw std::runtime_error("Whatever");
}
好了吗?
p。S我确实意识到有一种更好的方法来做到这一点-使用boost::scoped_array
或简单地使用std::wstring
,它允许调用析构函数释放分配的内存,只是好奇
你的见解是对的。
模式Acquire some resource
Do something
Release resource
从根本上是错误的,因为Do something
可能会抛出异常并泄漏资源。此外,您必须记住释放资源,这是错误的丰富来源。
这意味着eg。永远不要使用delete
外部析构函数,或者永远不要依赖于手动关闭文件句柄,永远不要手动解锁互斥锁等。学习智能指针,并尽可能地使用它们。
请注意,一些语言(不是c++)提供了finally
关键字,它允许您执行指令块,而不管是否抛出异常。c++使用RAII,如果你编写了合适的析构函数,你就不必担心资源释放问题。
我有一个c++ 0x的小实用程序,允许在块出口执行任意代码,如果你与编写不好的(或C)库接口一次或两次。
catch
在哪里?如果它在相同的作用域中- delete
可以在那里处理,否则您的#2是正确的选择。当然前提是你不想用正确的方法就像你自己在PS中提到的。
这取决于是什么东西。如果计算something
可以抛出异常,不,那就不好了。你必须照顾你获得的每一个资源,要么使用堆栈分配的变量(在作用域结束时被销毁),要么使用各种智能指针(std库,boost,随你挑)。
正确的方法是使用RAII模式。而不是使用原始指针,您应该将其包装在一个对象中,该对象在其析构函数中处理释放内存,例如std::wstring
或std::unique_ptr
。
如果您显式使用未包装的new,则必须显式使用delete。因此,在这种情况下,您必须捕获异常,然后调用delete。
正如你所说的,正确的方法是将缓冲区包装在一个c++类中,该类的析构函数将被调用。对于一个简单的缓冲区,开销最少的类可能是std::vector,但智能指针(例如boost::scoped_ptr)也可以工作。
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- 发生此错误:在0x0F2BFB7C(基于.dll)时引发异常 尝试更改大小是问题吗?
- 关于异常继承中的语法的问题
- 在使用 In Order 遍历成员函数时引发异常(堆栈溢出)时出现问题
- 存在内存访问异常,但我不确定我的代码中出了什么问题
- Catch2 迫使我在异常中添加对 std::string 的强制转换,这会产生其他问题吗?
- (SDL 渲染问题)C++ 引发异常:读取访问冲突.这是无效的
- PCL 和 CMake 的问题:链接时未定义统计异常值删除
- 值传递、异常/断言和类设计.批评/问题
- 在使用SFML时,我会得到记忆或出于界限异常,这是什么问题
- 此C 异常语法有什么问题(std :: runtime_error)
- 递归中的异常问题(8皇后问题)
- 如何避免意外异常导致的问题
- 为什么我们需要 RAII 来解决异常安全问题
- 异常处理问题,原因
- 如何通过引用捕获异常来解决局部变量问题
- 捕获琐碎的提升异常的奇怪问题
- 关于 swap() 操作的异常安全 - 这有什么问题?
- 关于异常规范和应用程序设计的问题
- C++ - 关于引发异常的几个问题