我讀過關於異常安全並得出以下問題:矢量分配和異常安全
在A類m_value和M_DATA應該是相互一致。但如果
m_data = data;
拋類不變將被打破。
class A
{
public:
void Set(const std::vector<unsigned int>& data)
{
m_value = ComputeValue(data);
m_data = data;
}
private:
int m_value; //That should be consistent with vector
std::vector<unsigned int> m_data;
}
我應該用一些副本和交換的變體來保護這段代碼嗎? 在這樣的每一行代碼中使用複製和交換是否是好的決定,還是可以按照原樣使用此代碼?
這是我的解決辦法,但我不知道,我應該使用它或它是多餘的複雜性:
void Set(const std::vector<unsigned int>& data)
{
std::vector<unsigned int> tmp_data(data);
m_value = ComputeValue(tmp_data);
m_data.swap(tmp_data);
}
附加:
另一個問題: 我應該寫我自己的異常安全的分配新建分配FY運營商或交換的功能,使其可以使用這樣的:
class B
{
public:
SetA(const A& a)
{
A tmp_a(a);
m_a.swap(tmp_a);
}
private:
A m_a;
}
而在A級
void A::swap(A& rhs)
{
using std::swap;
swap(m_data, rhs.m_data);
swap(m_value, rhs.m_value);
}
它取決於'ComputeValue'的合同。它是什麼? – Deduplicator
ComputeValue不合適,如果它是合同的意思。 – Nosturion
在這種情況下,交換是多餘的。當沒有任何東西可以拋出時,不需要或沒有意識防止異常。 – Deduplicator