Существуют ли идиомы C++, которые защищают вас от плохо упорядоченных элементов данных? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Существуют ли идиомы C++, которые защищают вас от плохо упорядоченных элементов данных? [закрыто]

Сообщение Anonymous »

Рассмотрите следующий случай, который приведет к записи памяти после ее освобождения.

Причина в том, что в классе 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»