Как использовать std :: pointer_safety [duplicate]

7
задан athos 1 January 2015 в 04:47
поделиться

2 ответа

Stroustrup расширяет эту дискуссию в своем C ++ FAQ , дело в том, что использование GC необязательно, поставщики библиотек могут реализовать один или нет:

Сбор мусора (автоматическая утилизация незарегистрированных областей памяти) необязательна в C ++; то есть сборщик мусора не является обязательной частью реализации. Однако C ++ 11 дает определение того, что GC может сделать, если он используется, и ABI (Application Binary Interface), чтобы помочь контролировать его действия.

Правила указателей и времен жизни выражаются в терминах «безопасно полученного указателя» (3.7.4.3); грубо: «указатель на что-то, выделенное новым или на его под-объект». для обычных смертных: [...]

Функции в стандарте C ++, поддерживающие это («интерфейс», к которому относится Stroustrup):

Эти функции представлены в предложении N2670 :

Его цель - поддерживать как сборку мусора, так и средства обнаружения утечки на основе достижимости. Это делается путем предоставления неопределенного поведения программам, которые «скрывают указатель», например, путем добавления другого значения, а затем затем превращают его обратно в обычный указатель и разыгрывают его. В настоящее время такие программы могут давать неверные результаты с консервативными сборщиками мусора, поскольку объект, на который ссылается только такой «скрытый указатель», может быть предварительно собран. По той же причине обнаруженные утечки на основе достижимости могут ошибочно сообщать, что такие программы утечки памяти.

Либо ваша реализация поддерживает «строгую безопасность указателей», и в этом случае возможна реализация GC имеет «расслабленную безопасность указателей» (по умолчанию), и в этом случае это не так. Вы можете определить это, посмотрев результат std::get_pointer_safety() , если он доступен.

Я не знаю никакой реальной стандартной реализации C ++ GC, но по крайней мере стандарт подготовив почву для этого.

8
ответ дан quantdev 24 August 2018 в 19:29
поделиться

В дополнение к хорошему ответу quantdev , который я получил, я хотел бы предоставить здесь немного больше информации (что не помещало бы комментарий).

Вот соответствующая программа на C ++ 11, которая демонстрирует, поддерживает ли реализация интерфейс GC:

#include <iostream>
#include <memory>

int
main()
{
#ifdef __STDCPP_STRICT_POINTER_SAFETY__
    std::cout << __STDCPP_STRICT_POINTER_SAFETY__ << '\n';
#endif
    switch (std::get_pointer_safety())
    {
    case std::pointer_safety::relaxed:
        std::cout << "relaxed\n";
        break;
    case std::pointer_safety::preferred:
        std::cout << "preferred\n";
        break;
    case std::pointer_safety::strict:
        std::cout << "strict\n";
        break;
    }
}

Вывод:

relaxed

означает, что реализация

relaxed

Выходы VS-2015:

relaxed

Выходы gcc 5.0:

prog.cc: In function 'int main()':
prog.cc:10:13: error: 'get_pointer_safety' is not a member of 'std'
    switch (std::get_pointer_safety())
            ^
6
ответ дан Community 24 August 2018 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: