gpt4 book ai didi

c++ - 在 C++ 中抛出异常时释放本地缓冲区

转载 作者:太空狗 更新时间:2023-10-29 23:24:59 24 4
gpt4 key购买 nike

假设我在 C++ 类中有以下构造函数:

MyClass::MyClass()
{
char* buffer = malloc(100);
if (0 != someD3DXCallThatCanFail(..., buffer, ...))
{
free(buffer);
throw MyException(L"some message");
}
char* buffer2 = malloc(200);
if (0 != anotherD3DCallThatCanFail(..., buffer2, ...))
{
free(buffer);
free(buffer2);
throw MyException(L"another message");
}
.. more code here where buffer and buffer2 are still used

free(buffer);
free(buffer2);
}

编辑:我讨厌 malloc/free 和 new/delete,但不幸的是我需要使用缓冲区来加载纹理,然后将其传递给 ID3D10ShaderResourceView、ID3D10Buffer、顶点缓冲区等。所有这些都需要指向缓冲区的指针。

我正在尝试使用异常而不是返回错误代码。此外,我希望在需要的地方创建缓冲区,并在不再需要它们时立即释放它们。

然而,看起来很丑陋的是,如果出现错误,无论我是返回错误代码还是抛出异常,我仍然应该记得清理到那时为止创建的所有缓冲区。如果我有 10 个缓冲区和 10 个可能的错误点,我将不得不调用 free() 100 次(在每次错误情况下记得释放每个缓冲区)。

现在假设我或更糟的是,我的同事想要更改一些逻辑,例如,在中间某处添加另一个缓冲区。现在,他必须查看方法其余部分可能发生的所有错误,并在每个此类位置为该缓冲区添加 free()。如果他赶时间,他很容易忽略一些这样的地方,你就会发生内存泄漏。

这也极大地膨胀了代码。

finally 关键字可以解决 Java 或 C# 中的问题。无论异常发生在代码的哪个位置,我仍然会在“最后”清理所有这些缓冲区(顺便说一句,垃圾收集不需要它)。据我所知,在 C++ 中,我可能必须为任何此类缓冲区创建一个成员变量,并在析构函数中确保清理缓冲区。对我来说看起来也很丑陋,因为名为“pBuffer”的成员变量,即使是私有(private)成员变量,也只是垃圾,因为它只在一个方法(在本例中为构造函数)中使用,并且在其余方法中始终为 NULL时间。

一定是个常见问题,但我没能使用搜索找到答案。谢谢!

最佳答案

停止手动管理内存,您将不会遇到这些问题。使用类似 std::vector<char> 的东西.

或者,您可以使用 Boost 的 shared_array 之类的东西,但这对于您在这里尝试做的事情来说太过分了:

http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/shared_array.htm

这里要说明的更普遍的一点是,您应该使用 RAII 习惯用法 - 也就是说,当您获取资源时,您将它们存储在一个类的实例中,该类的析构函数再次释放它们。然后,无论该资源拥有类的实例超出范围,都保证释放资源。

看这里:

http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

关于c++ - 在 C++ 中抛出异常时释放本地缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8406011/

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