объект в глобальной области действия вызывает сбой при выходе из программы - PullRequest
1 голос
/ 09 мая 2019

Похоже, что когда t помещен в глобальную область видимости, он попытается удалить сохраненный указатель?

ошибка

kk(70137,0x1000d65c0) malloc: *** error for object 0x100b20940: pointer being freed was not allocated
kk(70137,0x1000d65c0) malloc: *** set a breakpoint in malloc_error_break to debug
#include <set>
struct A {
    int k = 0;
};
class Test {
public:
    static std::set<A*> collection;

    ~Test(){
        collection.clear();
    }
};

Test t;
int main() {
    A* p = new A();
    t.collection.insert(p);
    delete p;
}
auto Test::collection = std::set<A*>();

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Однако, я думаю, что проблема немного в другом.

Нет, это не так.Учитывая ваше последнее редактирование:

Не определено, какой объект уничтожается первым, t или Test::collection.Когда Test::collection уничтожается первым, ваш деструктор Test::~Test() вызывает clear() для набора, который уже мертв.В каком бизнесе этот деструктор все равно портит статические объекты?Другие экземпляры Test все еще могут присутствовать и полагаться на статические данные членов.

Как насчет: Просто не делайте этого ??Вам уже говорили это несколько раз.

0 голосов
/ 09 мая 2019

Из-за статического порядка инициализации фиаско go может быть построено до componentAllocator и collection, затем они будут уничтожены в обратном порядке. Деструктор GameObject затем пытается уничтожить Transform, который вызывает componentAllocator, который уже был уничтожен.

Самое простое решение в этом случае - переместить объект go внутрь main(), и он всегда будет уничтожен перед вашими статическими переменными. Глобальные переменные редко нужны и часто вызывают подобные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...