LINUX.ORG.RU

C++: как сделать, чтобы это не компилировалось?

 


2

2

Берём ссылку на временный объект, который непонятно сколько времени существует. Потом пытаемся печатать содержимое объекта по ссылке, которая хрен знает куда ведёт.

-Wall -Werror – достаточно по-пацански так жить?


struct Data {
   const int &ref_;
   explicit Data(const int &_r)
   : ref_(_r) {

   }

   void print() {
      std::cout << ref_ << "\n";
   }
};

int main() {
   
   Data t(42);
   t.print(); // развал жопы на куски
   return 0;
}



Последнее исправление: lesopilorama (всего исправлений: 1)
Ответ на: комментарий от kvpfs_2

А кто сказал, что не индекс?

В Foo нет ссылки на исходный вектор, поэтому в i как в индексе нет смысла.

Но причина здесь - многопоток.

Нет. Причина здесь – это утекший указатель на элемент вектора.

То, что он утек в другой рабочий поток всего лишь стечение обстоятельств. Точно так же указатель мог утечь и в рамках одного потока, что я в своем примере и показал.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

В Foo нет ссылки на исходный вектор, поэтому в i как в индексе нет смысла.

Глобальные переменные?

Нет. Причина здесь – это утекший указатель на элемент вектора.

Васю сбила машина, в том ли причина, что он недостаточно изворотлив? Да. В том ли причина, что он ходит на красный?

kvpfs_2
()
Ответ на: комментарий от eao197

Ему весь проект вываливать? Логично, что это в некоторой степени псевдокод.

О чем мы спорим? Вы хотите сказать, что многопоток не вносит сложностей? А раз вносит, то и является причиной глобальной.

В деталях я согласился, что невалидный this причина, скорее всего

kvpfs_2
()
Ответ на: комментарий от kvpfs_2

О чем мы спорим?

Вероятно о том, что вы не желаете применить бритву Оккама и притягиваете лишние сущности.

Вы хотите сказать, что многопоток не вносит сложностей?

В данном конкретном случае – нет.

А раз вносит, то и является причиной глобальной.

Нет. И я вижу свою задачу в том, чтобы донести эту мысль до читателей форума, т.к. эту тему могут читать новички, которые пока еще не задумываются на темой инвалидации итераторов при модификации контейнера.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Значит перекинули указатель в цикл потока, он его по понятным причинам не обновляет, многопоток не виноват, Л - логика. В общем-то передача индекса вместо this - один из логичных вариантов решения данной проблемы (наряду с list), что и натолкнуло меня на эту дорожку читая по диагонали изначальный пост и увидев там

for(int i = 0; i<n; ++i)
  v.emplace_back(names[i], i);
...

что тригернуло мои шаблоны

kvpfs_2
()
Ответ на: комментарий от kvpfs_2

Значит перекинули указатель в цикл потока, он его по понятным причинам не обновляет, многопоток не виноват, Л - логика.

Простите, а что вам не понятно в приведенном мной примере?

Проблема та же, многопотока нет и в помине.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Мне всё понятно. Почему-то вам не понятно, что без многопотока данной ситуации бы не было, вызывалась бы функция-член, актуальный указатель передается каждый раз заново. Да, где-то можно вляпаться в это по глупости или незнанию (хз кто трезвый сохранит указатели от вектора, очевидно, что надо сохранять индексы)

kvpfs_2
()
Ответ на: комментарий от kvpfs_2

Почему-то вам не понятно, что без многопотока данной ситуации бы не было

Конкретно этой бы не было, конечно же, потому что если программа падает в другом рабочем потоке, то падает она там из-за многопотока.

Причина падения, однако же, не в многопотоке, а в реаллокации элементов вектора. Эта самая реаллокация к многопотоку отношения не имеет.

актуальный указатель передается каждый раз заново

С этого места поподробнее, пожалуйста. Есть ощущение, что наступает время очешуительных историй.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Причина падения, однако же, не в многопотоке, а в реаллокации элементов вектора. Эта самая реаллокация к многопотоку отношения не имеет.

Ладно, с этим хорош. Я вроде и не возражаю против версии с невалидным указателем, но почему-то мы спорим ))

С этого места поподробнее, пожалуйста. Есть ощущение, что наступает время очешуительных историй.

Не знаете что происходит здесь?

Obj q;
q.fn();
Obj w(q);
w.fn();

тогда очешуительные истории впору рассказывать вам самому

kvpfs_2
()
Ответ на: комментарий от kvpfs_2

Не знаете что происходит здесь?

Догадываюсь. Но вам нужно объяснить каким боком это все к обсуждаемой проблеме.

тогда очешуительные истории впору рассказывать вам самому

Лехко:

#include <iostream>
#include <string>
#include <functional>
#include <vector>

using Fn = std::function<void()>;

class Registry {
    std::vector<Fn> m_fns;

public:
    Registry() = default;

    void add(Fn fn) { m_fns.push_back(std::move(fn)); }
    void call_all() const {
        for(const auto & fn : m_fns) fn();
    }
};

class Foo {
    std::string m_name;

public:
    Foo(Registry & reg, std::string name) : m_name{ std::move(name) }
    {
        reg.add([this]() { std::cout << m_name << std::endl; });
    }
};

int main() {
    Registry reg;
    std::vector<Foo> foos;

//    foos.reserve(10);
    for(std::size_t i = 0; i < 10; ++i)
        foos.emplace_back(reg, std::to_string(i));

    reg.call_all();
}

Попробуйте запустить это с закомментированным и раскомментированным вызовом reserve. Вы получите проявление той же самой проблемы, но без многопотока. ЧТД.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

ЧТД

Я вот только не знаю почему вы это мне доказываете. Я вообще не утверждал, что без многопотока нельзя наговнокодить. Говорил лишь то что он этому способствует, мнение не поменял

kvpfs_2
()
Ответ на: комментарий от kvpfs_2

Я вот только не знаю почему вы это мне доказываете.

Потому что вы утверждаете, что причина в многопотоке:

Вы хотите сказать, что многопоток не вносит сложностей? А раз вносит, то и является причиной глобальной.

Так вот в данном случае многопоток не является причиной проблемы, с которой по недомыслию столкнулся lovesan.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Твой любимый Lisp настолько велик и могуч, что зарабатывать на жизнь приходится разработкой на C++ и C#, так получается?

Илон Маск пару месяцев назад зарепостил в твиттере скриншот с 4chan.

https://twitter.com/elonmusk/status/1830390502836854925

Там было написано следующее.

Люди, которые не способны защитить себя физически(женщины и мужчины с низким уровнем тестостерона и других мужских половых гормонов) парсят информацию через «фильтр консенсуса», это защитный механизм психики. Они, буквально, спрашивают себя не «является ли это правдой?», они спрашивают себя «а что подумают другие, если я буду считать что это правда?». Это делает их крайне уязвимыми к мнениям, основанным на сфабрикованном консенсусе. Если любой экран, на который они смотря, говорит одну и ту же вещь, они примут эту позицию, потому как их мозг интерпретирует это как то, что все в его племени верят в это.

Только альфа-самцы с высоким уровнем тестостерона, и нейродивергентные люди(привет аутистам!) свободны в восприятии новой информации через объективный вопрос «является ли это правдой?». Поэтому, Республика мужчин с высоким статусом - лучшее что можно придумать для принятия решений[об обществе]. Демократия, но демократия только для тех, кто свободен в своих мыслях.

Так вот, я подумал, что это, в принципе, применимо не только к политике. Это применимо в том числе к программированию, в частности к мнениям о популярности, непопулярности и распространенности языков программирования и платформ.

Причина, по которой такое всратое говно, как C++, Java, C#, Golang и прочие Python или прости господи Rust - популярны, заключается в том, что их продвигали крупные копрорации. Продвигали это даже мягко сказано. Агрессивно навязывали, и продолжают навязывать. Ну а лемминги разного рода, ну типа тебя, смотрят на это, и такие - о, это популярно, значит это правильно. Твой вот этот «фильтр консенсуса» буквально хакнули маркетологи из крупных корпораций.

Ну а что касается меня - я вообще пишу на всем, за что платят бабки, и/или, на том что мне интересно - т.к. часто могу диктовать на чем я буду писать.

Ну и да, C++ адское дрисное говно. То что ты задрочил каждые его к херам не нужные грабли(впрочем я ни секунды не сомневаюсь, что ты по ним все-равно ходишь, точно так же как и я, это ты только на форуме такой дохера умный) - чести тебе не делает, потому что как там Луговский писал то?

C++ — довольно таки примитивное, но монстровое поделие, полное исторически сложившихся нелепых нагромождений. Человек, который хорошо в нем ориентируется — это хорошее зубрилко, а не хороший программист. Умение героически преодолевать трудности, которые создает твой собственный инструмент, вместо того, чтобы решать непосредственно прикладную задачу, в современном мире ценится разве что только среди прыщавых сосок. Работодатель же это сомнительное умение не ценит, и совершенно справедливо.

В общем, так: хороший программист обязан знать Си. Хороший программист может знать C++, но это не обязательно уже. Главное, чтоб C и C++ не были единственными доступными программисту инструментами — иначе это адски паршивый программист.

Вобщем да, дрочилово C++ никак не помогает решать прикладные задачи, а помогает только дрочиться на C++ в окружении таких же задротов. Поэтому я стараюсь его вырезать там где могу вообще.

Твое мнение о нормальности или ненормальности кода, кстати, тоже не стоит нихера вообще, можешь его в жопу засунуть.

lovesan ★★★
()
Ответ на: комментарий от kvpfs_2

Это всё не про многопоточность, а про кривоту крестов.

Кстати, обычно, когда крестолюбцы натыкаются на такие грабли, они начинают везде совать «умные» указатели, добавляя еще граблей тем самым. Рустолюбцы как крестолюбцы в кубе, тут вообще, кстати, пошли еще дальше - и сразу везде их пользуют.

lovesan ★★★
()
Последнее исправление: lovesan (всего исправлений: 2)
Ответ на: комментарий от lovesan

заключается в том, что их продвигали крупные копрорации.

корпорациям надо бабки зарабатывать и нагибать конкурента, иначе они умрут. потому они будут продвигать все, что им помогает нагибать конкурента и зарабатывать бабки.

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

если б лисп давал возможность грести бабло лопатой и передушить всех конкурентов, корпорации продвигали бы его.

alysnix ★★★
()
Ответ на: комментарий от lovesan

Причина, по которой такое всратое говно, как C++, Java, C#, Golang и прочие Python или прости господи Rust - популярны, заключается в том, что их продвигали крупные копрорации. Продвигали это даже мягко сказано. Агрессивно навязывали, и продолжают навязывать. Ну а лемминги разного рода, ну типа тебя, смотрят на это, и такие - о, это популярно, значит это правильно

Неверно. Всё проще: C++ в разы проще лиспа, потому что тупой процедурный - базово всё последовательно написанное исполняется как написано. В лиспе думать надо. А хочется написать и видеть как оно исполнится.

lesopilorama
() автор топика
Ответ на: комментарий от alysnix

Да, бред чувака про корпорации просто жесточайше ложный.

Корпорации продвигают C++, ну допустим. А продвигают почему? В совете директоров - крестовики сидят что-ли? Да им насрать на это. Продвигают то, на чём легче начать кодить прямо сейчас любой макаке с рынка труда.

lesopilorama
() автор топика
Ответ на: комментарий от alysnix

сразу видно, что ты и близко к руководящим должностям не подбирался, и не знаешь как принимаются решения, а второе - только подтверждаешь написанное

«ну не могли же они тупануть и сделать херню! Они же гугол! Они же микрософт! Там много умных людей!». Могли. Сделали. И продолжают делать.

lovesan ★★★
()
Ответ на: комментарий от lovesan

сразу видно

Но это не точно, иначе бы ты пруфанул, что это видно. Например, когда видно что-то математику, он это излагает так, что все читатели приходят к тому же выводу, чтобы было видно всем. А ты что-то там увидел, но для всех загадка что там тебе видно. С нами тоже поделись, что там видно тебе, бугагага.

Тебе никто не говорил про умных людей. Корпорации руководствуются профитностью, а не умностью людей в руководстве)

lesopilorama
() автор топика
Последнее исправление: lesopilorama (всего исправлений: 1)
Ответ на: комментарий от lesopilorama

C++ в разы проще лиспа

Дай угадаю - ты лисп в глаза не видел. На ЛОРе читал.

Нет, кресты объективно сложнее даже того же CL. Кресты дико переусложненный язык. Причем сложность эта, крестовая, абсолютно не essential complexity. Это просто шизофреническое нагромождение исторических нелепостей, конфликтующих друг с другом.

lovesan ★★★
()
Ответ на: комментарий от lovesan

Дай угадаю - ты лисп в глаза не видел. На ЛОРе читал.

А если не дам, чо будешь делать. Бугагага. Капец ты.

Нет, кресты объективно сложнее даже того же CL

Не нет, а да. Я же тебя точно в таком стиле переспорю, у меня времени до жопы.

lesopilorama
() автор топика
Ответ на: комментарий от lovesan

И ты видимо тоже никогда и рядом не стоял с руководящими должностями.

Ты всё ещё не осилил доказать, что тебе это именно видимо, а не воображено и не нафантазировано. Бугага.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

Почему тебе кажется, что если большая контора что-то толкает, или вообще, что-то делает, то это автоматически правильно, и так и надо? Потому что большая? Потому что «ну не могли же они…»? Могли.

lovesan ★★★
()
Ответ на: комментарий от lovesan

Кресты дико переусложненный язык.

Ты что, неосилятор таких простых конструкций как

std::vector<int> v = {1,2,3,4,5,6};
for (auto x : v) {
   call_some_function(x);
}

Тут любой школоте понятно чо происходит даже не вникая в какой-то там синтаксис. Навалили чисел в вектор, пробежались в цикле, куда-то их засунули. Примитивнейшая процедурная хрень.

lesopilorama
() автор топика
Последнее исправление: lesopilorama (всего исправлений: 1)
Ответ на: комментарий от lovesan

Почему тебе кажется, что если большая контора что-то толкает, или вообще, что-то делает, то это автоматически правильно, и так и надо

Потому что во вселенной не существует ничего, кроме реальности. Ты буквально спрашиваешь «почему ты считаешь, что реальность - это то, как надо»?

Реальности глубоко до жопы как там кому надо, она складывается из массы реальных обстоятельств, которые ты даже понять не осилишь и я тоже вероятно. Реальность можно только изучать, объективно описывая, а не фантазируя как там что «надо». Кому надо - все эти люди видимо сдохли к е*еням собачим, раз не могут реализовать это надо.

lesopilorama
() автор топика
Последнее исправление: lesopilorama (всего исправлений: 1)
Ответ на: комментарий от lovesan

загляни в сорцы любой реализации STL, умник

Тебя смущают наркоманские двойные подчёркивания в именах переменных и куча переводов строк или достаточно простые шаблоны или чо? Это ж библиотека стандартная, её писало 1000500 бородатых мужиков с печатями и подписями на каждый чих как в министерстве обороны. Эту срань никто не читает, она не для этого нужна, она максимально официозно фиксирует некий простой алгоритм и в целом на неё всем похрен. Главное, что это позволяет взять вектор и насрать туда и это будет понятно как работать.

lesopilorama
() автор топика
Ответ на: комментарий от lovesan

или в сорцы какого-нибудь вебкита

От чтения сишной лапши в линукс кернеле или в постгресе тебя вообще порвёт тогда получается. А если что-то аналогичное попытаться на лиспе налабать, то вообще жопа отвалится. То есть, если чуваки на достаточно простом С++ написали что-то пугающее тебя, что же с тобой будет когда на оверкильно переусложнённом монструозном лиспе налабают то же самое, там же совы об глобусы протрутся до дыр.

lesopilorama
() автор топика
Последнее исправление: lesopilorama (всего исправлений: 2)
Ответ на: комментарий от lesopilorama

Потому что во вселенной не существует ничего, кроме реальности. Ты буквально спрашиваешь «почему ты считаешь, что реальность - это то, как надо»?

Что за шизофилософия?

Ты утверждаешь - кресты используют потому что они помогают увеличивать профит.

Тут сразу два ложных утверждения, первое что корпорации вообще стремятся увеличивать профит(пример тому какие-нибудь Sun или Нокла), а второе что это якобы помогают делать кресты, т.к. дохера такой вот практичный язык.

Я говорю, что нет, это, естественно, не так. Кресты только мешают. А причина по которой они используются - идиоты в менеджменты в корпорациях, в частности в 90е. Дальше там конфликты интересов и прочее. C++ отвратительный язык, который вообще не стоит использовать. Ну по крайней мере не стоит на нем начинать новых проектов, это уж точно.

lovesan ★★★
()
Ответ на: комментарий от lovesan

Ты утверждаешь - кресты используют потому что они помогают увеличивать профит.

Нет, только потому что задача найма кадров для лабания говнокода решается наймом крестовиков, но не решается наймом лисповиков.

lesopilorama
() автор топика
Ответ на: комментарий от lovesan

первое что корпорации вообще стремятся увеличивать профит

Поделись с нами тогда что стараются сделать корпорации, что там увеличить, их цели основные. Мужики-то может не в курсе.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

Если бы там только с подчеркиваниями была проблема… Смешное

Эту срань никто не читает

Примерно любой более-менее сложный код на крестах это write-only говно. Лучше только Perl может справиться.

lovesan ★★★
()
Ответ на: комментарий от lovesan

Примерно любой более-менее сложный код на крестах это write-only говно.

Да не, типичный нормальный C++ кодстайл читается довольно легко. не мочь прочитать типичную процедурную портянку, где каждая следующая строчка исполняется после предыдущей - ясно, что надо гидроцефалом родиться и с телеги падать в деревне.

lesopilorama
() автор топика
Ответ на: комментарий от lovesan

Ты лиспа в глаза не видел, завязывай уже высирать про него свои фантазии.

А почему тебе можно срать про кресты, не видя их в глаза, а мне про лисп в том же духе нельзя.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

Если в компании задача найма состоит в том чтобы нанимать «крестовиков», или же вообще «программистов на X», то такие компании лучше обходить стороной вообще. Там идиоты сверху-донизу.

lovesan ★★★
()
Ответ на: комментарий от lovesan

Нет, задача найма состоит в том, чтобы нанять кого-то, кто может начать реализовывать логику. Им посрать на чём лабатели будут писать. Так сложилось, что лисповики проиграли почему-то.

lesopilorama
() автор топика
Ответ на: комментарий от lovesan

Я с крестами дрочусь еще со времен учебы в шараге, девочка, и на них писал такое, к чему тебя бы не подпустили просто.

История шикарная, но учитывая другие твои высказывания можно догадаться, что вероятность нап*зделова братанам здесь неиллюзорна. А так норм конечно!

lesopilorama
() автор топика
Ответ на: комментарий от lovesan

У тебя там в голове уже какие-то эстафеты, олимпиады?

Чё там за эстафеты у тебя, поделись с нами, не держи в себе. Вроде не поднимался этот вопрос в срачике нашем.

lesopilorama
() автор топика
Ответ на: комментарий от lovesan

А, тебя смутило слово проиграли. Ну да, лисповиков выепало почему-то. Наверное язык говно. Современные кресты и более краткие и семантически богатые. Если кому-то надо в одной короткой строке описать дохера всего, то можно вообще питончик взять, нахер лисп-то уссался.

Ты бы конкренее продвигал своё говнище: взял кусок кода на сраных крестах, на сраном питоне. Потом взял рядом положил на лиспе и сказал, вот народ смотрите вы говно, а лисп может лучше.

lesopilorama
() автор топика
Ответ на: комментарий от lovesan

обвинять во всем «корпорации» это удел неомарксистов, троцкистов, лгбт, блм, сторонников теорий заговора и свидетелей рептилоидов. уже такая вот речь говорит многое об ее авторе.

в плохую компанию попал ты, лавсан, в своем лисповом угаре

alysnix ★★★
()
Ответ на: комментарий от alysnix

Ну почему сразу корпорации? Виноват тот факт что 95% населения идиоты. А большая часть - еще и ведомые идиоты, и жрут любое говно которое им суют(типа C++), причмокивают и добавки просят.

lovesan ★★★
()
Ответ на: комментарий от alysnix

Да типичная подростковая йебала. Начитался чел лиспа, астрологии, хаскеля, диагностики кармы, нового завета, иудаизма, лекций о превосходстве мужиков и о свободном разуме и сидя на троне из чувства собственного превосходства харкает сверху на быдло. Занятие конечно приятное, но к 40 годам это будет дикое пугало безперспективное)

lesopilorama
() автор топика
Ответ на: комментарий от lovesan

Жесть, я знаю одного челика, который увлекается натальными картами и гаданием кто когда сдохнет, базируясь на точной секунде рождения, пьёт только правильный эспрессо, не ест мясо, рассуждает про правильный аудиофильский звук, духовность. Умеет только в PHP и постоянно бегает по интернету хейтит быдло. Сам при этом такой даун, что туши свет. Бугага. Мы ржом с него. Любим позлить.

lesopilorama
() автор топика
Последнее исправление: lesopilorama (всего исправлений: 1)