Инициализация базового класса и элемента с использованием того же указателя без UBC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Инициализация базового класса и элемента с использованием того же указателя без UB

Сообщение Anonymous »

При просмотре некоторого кода тестирования я столкнулся с этой ситуацией: < /p>
Предположим, у нас есть эти два класса: < /p>

Код: Выделить всё

class Project
{
public:
Project(std::string path);
~Project;
// [many more functions]
};

class ResourceManager
{
public:
ResourceManager(Project &proj);
virtual ~ResourceManager();
// [many more functions]
// [notably no getProject()]
};
< /code>
В тестовом коде существует «поддельная» версия ресурса: < /p>
class FakeResourceManager : public ResourceManager
{
std::unique_ptr
 project_;

Project* makeProject()
{
project_= std::make_unique("/some/path"); // oops, accessing non-initialized member
return project_.get();
};

public:
FakeResourceManager()
: ResourceManager(*makeProject())
{}

virtual ~FakeResourceManager(); // defaulted in cpp

void markResourceAsDirty(); // 'extension' of base functionality for testing
};
Это, конечно, не работает, поскольку участник проекта _ еще не инициализируется, когда называется MakeProject , который администратор Адреса завораживает во время выполнения.

Код: Выделить всё

class FakeResourceManager : public ResourceManager
{
std::unique_ptr project_;

FakeResourceManager(std::unique_ptr project)
: ResourceManager(*project.get())
, project_(std::move(project)) //(1)
{}

public:
FakeResourceManager()
: FakeResourceManager(std::make_unique("/some/path"))
{}

virtual ~FakeResourceManager(); // defaulted in cpp

void markResourceAsDirty(); // 'extension' of base functionality for testing
}
Точки, которые я рассмотрел:

std :: move (1) уникального_птра не должен недействительно указатель, ранее возвращаемый get () . Участник «Передвигался» должен правильно удалить проект по разрушению. Поскольку это не так, должно быть нормально иметь свисание ссылки здесь (или это все еще ub?) /> Это решение по -прежнему содержит UB (или какую -то другую логическую ошибку), или это безопасно?

Подробнее здесь: https://stackoverflow.com/questions/797 ... without-ub
Ответить

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

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

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

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

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