头文件:
#ifndef MUTEXCLASS
#define MUTEXCLASS
#include <pthread.h>
class MutexClass
{
private:
pthread_mutex_t & _mutexVariable;
public:
MutexClass (pthread_mutex_t &);
~MutexClass ();
};
#endif // MUTEXCLASS
源文件:
#include "mutexClass.h"
#include <stdexcept>
MutexClass::MutexClass (pthread_mutex_t & arg) : _mutexVariable (arg)
{
_mutexVariable = PTHREAD_MUTEX_INITIALIZER;
int returnValue = pthread_mutex_lock (&_mutexVariable);
if (returnValue > 0)
{
throw std::logic_error ("Mutex couldn't be locked!");
}
}
MutexClass::~MutexClass()
{
pthread_mutex_unlock (&_mutexVariable);
}
我应该在哪里捕获构造函数中引发的异常?
可以处理构造函数中引发的异常
try { MutexClass m; ... } catch(const std::logic_error& e) { ... }
)MutexClass
实例成员的对象(包括作为基础子对象...,即通过创建从派生的对象的代码MutexClass
)请注意,对于较大对象(对于关系has-a
或is-a
关系)的成员的对象的构造函数中抛出的异常,有一个棘手的部分。如果成员的构造引发异常,则不会调用较大对象的析构函数...在传播异常之前,只有已构造的成员将被销毁。例如一个类似的类:
struct Foo {
MyData * data;
MutexClass m;
MyData() : data(new int[1000]) { }
~MyData() { delete[] data; } // NOT called if m constructor throws
};
如果MutexClass
构造函数抛出异常,将泄漏内存。
同样在编写异常处理程序之前,请问自己是否捕获异常是正确的事情(即,如果您知道在发生这种情况时该怎么做)。捕获异常并“隐藏”它是因为最糟糕的选择,因为在这种情况下您不知道该怎么办。
在特定情况下,如果您无法锁定新创建的互斥锁,您是否可以期望系统仍处于良好状态,以使其保持运行状态是一个好主意?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句