头文件:
#ifndef MUTEXCLASS
#define MUTEXCLASS
#include <pthread.h>
class MutexClass
{
private:
pthread_mutex_t & _mutexVariable;
public:
MutexClass (pthread_mutex_t &);
~MutexClass ();
};
#endif // MUTEXCLASS
Run Code Online (Sandbox Code Playgroud)
源文件:
#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);
}
Run Code Online (Sandbox Code Playgroud)
我应该在哪里捕获构造函数中抛出的异常?
可以处理构造函数中抛出的异常
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
};
Run Code Online (Sandbox Code Playgroud)
如果MutexClass构造函数抛出异常,将泄漏内存.
在编写异常处理程序之前,请问自己,捕获异常是否正确(即如果您知道在发生该情况时该怎么做).捕获异常并"隐藏"它,因为在这种情况下您不知道该怎么做是最糟糕的选择.
在特定情况下,如果您无法锁定新创建的互斥锁,您是否可以期望系统仍然保持良好的状态以保持其运行是一个好主意?
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |