LINUX.ORG.RU

Избранные сообщения fsb4000

Навеяно свежей дырой в Xorg

Форум — Development

Привет, ЛОР!

Ты, наверное, уже видел свежую дыру в Xorg, патч для которой выглядит буквально вот так:

-        else
+        else {
             free(to->button->xkb_acts);
+            to->button->xkb_acts = NULL;
+        }

В связи с этим у меня возник вопрос: а почему в стандартной библиотеке C нет макроса SAFE_FREE()?

#define SAFE_FREE(ptr) do{free(ptr);(ptr)=NULL;}while(0)

Напомню, что значение указателя после вызова free() является неопределённым согласно стандарту. Не только значение памяти, на которое он указывает, но и значение самого указателя, и работа с ним представляет собой жуткое undefined behaviour, а значит единственное что можно сделать – занулить его.

Так вот, почему даже таких банальных вещей нет? Я уже не говорю про строковый тип, а то даже Эдичка тут строки не осилил.

Моя гипотеза тут: C – это язык культа страданий во имя страданий.

 , ,

hateyoufeel
()

Пара вопросов о std::valarray

Форум — Development

1. Почему конструктор для valarray сделали не в том же стиле, что и vector.

valarray( const T& val, std::size_t count );

vector( size_type count, const T& value,
        const Allocator& alloc = Allocator() );
Есть ли смысл в том, чтобы первым параметром указывать значение, а не наоборот?

2. Почему слайсы valarray не являются stl контейнерами и для них нет итератора?

std::valarray<int> a(n);
...
for(auto x : a[std::slice(0, 50, 2)]){
    std::cout<<x<<"\n";
}
Я ожидал бы, что такой код выведет все элементы из a с чётными индексом, но нет.

 

Waterlaz
()

Получить тип возвращаемого значения из лямбды

Форум — Development

Нюанс в том, что незивестен точный тип лямбды, они приходят из пользовательского кода, следовательно мне неизвестны типы и количество аргументов, которые функтор ожидает, т.е. я не могу использовать invoke_result<>. Нужно заглянуть в класс, схватить любой оператор() и вернуть тип возврата. Получилось такое:


template <typename T>
struct Return_type;
template <typename R, typename... Args>
struct Return_type<R(Args...)> {using type = R;};
template <typename R, typename Q, typename... Args>
struct Return_type<R (Q::*)(Args...)const> {using type = R;};
template <typename R, typename Q, typename... Args>
struct Return_type<R (Q::*)(Args...)> {using type = R;};

struct A{
	struct V {
		double operator()(int t)const {return 5;}
	};
};

int main() {
	auto l = [](double a, int e)mutable{return 2;};
	auto l2 = [](int a){;return 2;};
	Return_type<decltype(&decltype(l)::operator())>::type a;
	Return_type<decltype(&decltype(l2)::operator())>::type a2;
	Return_type<decltype(&A::V::operator())>::type a3;


	auto l3 = [](auto b){;return 2;};
	Return_type<decltype(&decltype(l3)::operator())>::type a4;

	return 0;
}

И в принципе свою задачу я решил, мне этого хватит, но не знаю как (и возможно ли вообще) получить тип от лямбды, внутри которой шаблонный оператор() (тот, что auto l3). Решаема ли задача в случае с l3?

 

kvpfs
()

Компеляция QT проекта по x64 не понятный глюк

Форум — Development

Добрый день. Помогите понят почему такой глюк. Пишу программу на QT для работы с сокетами, написал клинскую часть на на QT для Orange PI, всё собралось и работает как часы. Начал писать серверную часть пишу windows, поставил компилятор под x64 всё собирается нормально запускается но при этом программа глючит, подключаюсь к сокету и больше не чего не работает. Удалил компилятор под x64 поставил под 32 бита проблема исчезла. Написал серверную часть программы. Начал собирать под linux x64(debian), и проблема повторилась, собралось, но также работает не корректно. Помогите понять иза чего? Собираю вот так, через консоль.

qmake -project "CONFIG+=QT" "QT+=network"
qmake server.pro
make

 

mannaz2004
()

Как обычно создается синглтон: наследованием или прямым кодом?

Форум — Development

Нигде не нашел внятного ответа на простой вопрос.

В программе нужно иметь несколько синглтонов, например один из вариантов синглтона Майерса:

class CMySingleton
{
public:
  static CMySingleton& Instance()
  {
    static CMySingleton singleton;
    return singleton;
  }

// Other non-static member functions
private:
  CMySingleton() {}                                  // Private constructor
  ~CMySingleton() {}
  CMySingleton(const CMySingleton&);                 // Prevent copy-construction
  CMySingleton& operator=(const CMySingleton&);      // Prevent assignment
};

Как такие классы-синглтоны правильнее создавать? Просто надо наследоваться от вышеуказанного CMySingleton, или надо напрямую привести хидер обычного класса к такому же состоянию и прописать реализацию метода Instance()?

 , singletone,

Xintrea
()