Предположим, у нас есть эти два класса: < /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
};
Код: Выделить всё
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
Мобильная версия