Рассмотрите следующий случай, который приведет к записи памяти после ее освобождения.
Причина в том, что в классе PoorlyOrderedMembers член m_pData объявлен после члена m_nc, что означает, что будет вызван d'tor std::unique_ptr и экземпляр ClassWithData будет удален непосредственно перед тем, как d'tor класса NaughtyClass напишет к нему.
Во время записи вы, вероятно, можете получить подсказки о проблеме, если попытаетесь поместить обе инициализации членов в список инициализаторов и получите ошибку или предупреждение. В качестве альтернативы вы можете изменить NaughtyClass и PoorlyOrderedMembers на использование std::shared_ptr, но это становится очевидным только после того, как вы поймете, что здесь есть проблема.
Что будет означать, что здесь что-то не так при просмотре кода после того, как ошибка уже была допущена?
#include
#include
class ClassWithData
{
char m_carray[32]{};
public:
char* data() { return m_carray; }
static constexpr size_t capacity() { return sizeof(m_carray); }
};
class NaughtyClass
{
ClassWithData* m_p = nullptr;
public:
~NaughtyClass()
{
char const m[] = "d'tor called";
memcpy(m_p->data(), m, sizeof m);
static_assert(sizeof(m)
Подробнее здесь: https://stackoverflow.com/questions/782 ... ta-members
Существуют ли идиомы C++, которые защищают вас от плохо упорядоченных элементов данных? [закрыто] ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение