1
У меня эти классы в моей библиотеке.Класс шаблона с компиляцией CRITICAL_SECTION, но при использовании его получил ошибку
class SingleLock
{
public:
SingleLock(CRITICAL_SECTION *pCS);
~SingleLock();
private:
LPCRITICAL_SECTION m_cs;
};
SingleLock::SingleLock(CRITICAL_SECTION *pCS)
{
m_cs = pCS;
EnterCriticalSection(m_cs);
}
SingleLock::~SingleLock()
{
LeaveCriticalSection(m_cs);
}
template <typename T>
class Callback
{
public:
Callback() : m_current(), m_total(), m_cs()
{
InitializeCriticalSection(&m_cs);
}
~Callback()
{
DeleteCriticalSection(&m_cs);
}
void SetCurrent(T current)
{
SingleLock(&m_cs);
m_current = current;
}
void SetTotal(T total)
{
SingleLock(&m_cs);
m_total = total;
}
T GetCurrent()
{
SingleLock(&m_cs);
return m_current;
}
T GetTotal()
{
SingleLock(&m_cs);
return m_total;
}
private:
T m_total;
T m_current;
CRITICAL_SECTION m_cs;
};
The Callback
класс компилируется, но в то время как попытаться использовать какой-либо метод в коде, мой код не компилируется. Я изменил его на это:
template <typename T>
class Callback
{
public:
Callback() : m_current(0), m_total(0), m_cs()
{
InitializeCriticalSection(&m_cs);
}
~Callback()
{
DeleteCriticalSection(&m_cs);
}
void SetCurrent(T current)
{
EnterCriticalSection(&m_cs);
m_current = current;
LeaveCriticalSection(&m_cs);
}
void SetTotal(T total)
{
EnterCriticalSection(&m_cs);
m_total = total;
LeaveCriticalSection(&m_cs);
}
T GetCurrent()
{
EnterCriticalSection(&m_cs);
T result = m_current;
LeaveCriticalSection(&m_cs);
return result;
}
T GetTotal()
{
EnterCriticalSection(&m_cs);
T result = m_total;
LeaveCriticalSection(&m_cs);
return result;
}
private:
T m_total;
T m_current;
CRITICAL_SECTION m_cs;
};
И теперь все работает, может кто-нибудь объяснить, почему это происходит?
Причина в том, что 'SingleLock (&m_cs);' создает * временный * экземпляр, который немедленно уничтожен. Объявление переменной сохраняет эту переменную в области действия до тех пор, пока функция не вернется, когда она будет уничтожена. –