【发布时间】:2016-06-19 08:08:12
【问题描述】:
实际上我使用以下方法来确保在我的对象中引发异常时正确清理我的缓冲区,但它需要的代码比下面的示例多得多。
class Foo
{
private:
int m_bufferSize;
char m_isNetBufferSet;
char* m_netBuffer;
setBufferSize(const int bufferSize)
{
if (!m_isNetBufferSet)
{
m_bufferSize = bufferSize;
m_netBuffer = new char[m_bufferSize];
ZeroMemory(m_netBuffer, m_bufferSize);
}
}
freeBuffer()
{
if (m_isNetBufferSet)
{// i'm not using m_netBuffer != NULL because i'm not sure how it behave
delete [] m_netBuffer;
m_isNetBufferSet = 0;
m_bufferSize = 0;
}
}
public:
Foo()
{
m_isNetBufferSet = 0;
m_bufferSize = 0;
m_netBuffer = NULL;
}
bar()
{
std::wstring hello(L"Hey, how are you?");
freeBuffer();
setBufferSize(hello.size() * sizeof(wchar_t));
throw std::runtime_error("Oh noes something suddenly went wrong :(");
/* never reached... */
}
~Foo()
{
freeBuffer();
}
};
我知道局部变量和对象在发生异常后会被释放,但是对象内部分配的指针是否会在引发异常后自动释放? 是否可以通过执行以下操作来简化我的代码而不造成内存泄漏?
class Foo
{
public:
bar()
{
std::wstring hello(L"Hey, how are you?");
char *netBuffer = new char[hello.size() * sizeof(wchar_t)];
throw std::runtime_error("Oh noes something suddenly went wrong :(");
/* never reached... */
}
};
【问题讨论】:
-
TL;DR;您使用
new创建的任何内容都不会被自动删除,这代表您。这就是你不应该这样做的主要原因。 -
new只是创建内存,如果您想要描述的行为,请尝试使用 RAII,例如std::unique_ptr,这是一个堆栈对象,其中有一个析构函数,其中调用了delete。跨度>
标签: c++ exception memory-leaks