Wake of Gods Forum | Форум Во Имя Богов

Full Version: С++, общая тема
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
packa Wrote:Вот именно поэтому я предпочитаю терроризировать живых людей, а не находить не пойми-что в гугле)

А я предпочитаю просто написать в компиляторе строчку #include <queue>. Если не ругается - значит, контейнер есть.
И терроризировать никого не надо. Компилятор - твой главный помощник, используй его как можно чаще.

gamecreator, ну и пусть.
Вообще, есть замечательный сайт на котором про стандарт написано неплохо - http://www.cplusplus.com.
Насчёт терроризирования людей - могу посоветовать решать проблемы в он-лайн режиме. В том числе, возникающие в процессе изучения вопросы лучше задавать так чтобы быстро получать ответ. Это конечно замечательный форум, но я, к примеру, куда быстрее отвечу на вопрос по аське или контакту нежели тут и мне кажется, что это будет эффективнее. вот.
p.s. в принципе, на некоторые вопросы я готов отвечать, контакты могу по личке кинуть (если их тут в профиле нет Sm)
Quote:Компилятор - твой главный помощник, используй его как можно чаще.
Имхо, так можно поступать, имея за плечами немалый опыт.
Ну вот, допустим, не заругался, а как им пользоваться? и т.д. Также перебирать методы?
А если там, к примеру, вместо push_back - qpush_back. Я ввел первый вариант и сделал вывод - queue не умеет добавлять в конец, т.к. компилятор выдал ошибку на push_back.
Quote:Вообще, есть замечательный сайт на котором про стандарт написано неплохо - http://www.cplusplus.com.
Жаль только не русский =( На нем в разы удобнее)
Quote:p.s. в принципе, на некоторые вопросы я готов отвечать, контакты могу по личке кинуть (если их тут в профиле нет Sm)
Ну отказываться не стану Sm

Quote:Насчёт терроризирования людей - могу посоветовать решать проблемы в он-лайн режиме.
Здесь самая главная проблема в том, что через некоторое время это начинает напрягать человека. Возможно даже инвиз-статус) Надоедает же... А на форуме, во-первых не 1 человек, во-вторых между вопросами проходит достаточное кол-во времени, чтобы не напрягать. Хотя чувствуется что я тот еще доставатель ^_^
Ты не столько доставатель, сколько не умеешь (или не хочешь тратить на это время) правильно формулировать вопросы и задачи.
Впервые сам задам сюда вопрос.

Как вообще можно изменить значение std::shared_ptr внутри метода класса, если этот смарт-пойнтер является одним из его полей?
То бишь такой вариант: (Click to View)
- не работает.

Единственный способ изменить sh_ptr - это поместить его в список инициализации конструктора: в его заголовке вместо Test() нужно написать Test() : sh_ptr(new int(42)). В этом случае всё нормально, а *(tst.sh_ptr) действительно возвращает 42. Но как быть, если я захочу поменять его внутри конструктора/метода, а не только инициализировать? Это же не константа, в конце концов...

P.S. До этого не приходилось пользоваться смарт-пойнтерами внутри классов, применял их лишь на уровне функций. Внутри классов всегда юзал обычные сишные указатели - да и, всё-таки, редко приходится выделять память в куче внутри какого-то класса...
у меня нет std::shared_ptr и в стандарте я его не нашёл. с другой стороны, есть boost::shared_ptr но он вроде работает немного иначе. если интересует. могу бустовый глянуть.
Это в C++11 shared_ptr находится прямо в std:: - и, соответственно, нужно просто инклудить #include <memory>.
А в C++03, shared_ptr находится уже в std::tr1:: - и поэтому инклудить нужно #include <tr1/memory>.

Бустовские смарт-пойнтеры действительно работают немного иначе, поэтому хочется узнать именно про STL-ные... Но в принципе, они тоже подойдут.
Во-первых, tr1 у меня тоже нету Bad
Во-вторых, http://ru.wikipedia.org/wiki/C%2B%2B11#....0.B8.D1.8F может поможет.
В-третьих, я так понимаю что неважно, что буст. Неэффективный но рабочий способ с явным вызовом конструктора:
sh_ptr = boost::shared_ptr<int>(new int(42));
NIKr0m@nceR Wrote:Во-первых, tr1 у меня тоже нету
Странно. Что ж это за компилятор такой? 118

NIKr0m@nceR Wrote:Неэффективный но рабочий способ с явным вызовом конструктора
Копировать временный указатель на новый объект в куче? Хм, а ведь действительно вариант... Спасибо, что-то я затупил. Ещё можно пользоваться функцией std::make_shared, но она заодно осуществляет копирование объекта Bad О ней я, наверное, позже напишу.

Пока что интересует такой вопрос. Есть такой код: (Click to View)
   
Вывод приложения таков:

Test default ctor
Test dtor
Test dtor
---------------
Test default ctor
Test dtor


Почему деструктор в первом случае вызывается дважды, а не один раз? Ведь никакого копирования, как видно из вывода, не было... Неужели компилятор вначале пытается освободить всё, что содержится "внутри указателя" - а лишь потом удаляет "обычные" объекты со стека?
(08.05.2012 00:28)Efrit Wrote: [ -> ]
NIKr0m@nceR Wrote:Во-первых, tr1 у меня тоже нету
Странно. Что ж это за компилятор такой? 118

У меня в MSVC 2008 (9.0) тоже нет tr1.

Efrit, скомипилируй с листингом кода на асме и посмотри где происходит второй вызов деструктора.
tr1 (я так понял "C++ Standards Committee's Library Technical Report (TR1)") это дополнение, которое позже перетекло в С++11, а у меня старенький гцц который у меня руки не доходят обновить - там и буст, и гтк, и кутэ (за компанию), и ещё что-то а у меня сессия.
твой пример я посмотрел, при попытке проследовать по шагам, нашёл что первый деструктор заканчивается чем-то вроде
Code:
inline int atomic_exchange_and_add( int * pw, int dv )
{
    // int r = *pw;
    // *pw += dv;
    // return r;

    int r;

    __asm__ __volatile__
    (
        "lock\n\t"
        "xadd %1, %0":
        "=m"( *pw ), "=r"( r ): // outputs (%0, %1)
        "m"( *pw ), "1"( dv ): // inputs (%2, %3 == %1)
        "memory", "cc" // clobbers
    );

    return r;
}
а в асмовставках я вообще не силён.
после этого пишется строчка, потом снова вызывается деструктор и дебаггер вылетает при поимке очередного исключения. вот.

Upd. Ну да, ты прав на выходе из блока вызываются деструкторы t и указателя. вроде так и должно быть.
(08.05.2012 00:28)Efrit Wrote: [ -> ]Почему деструктор в первом случае вызывается дважды, а не один раз? Ведь никакого копирования, как видно из вывода, не было...
конструктор указателя может работать напрямую с памятью в обход конструктора копирования
Нет. Там дело именно в том, что вызывается деструктор указателя, который вызывает деструктор указываемого объекта, а потом вызывает деструктор самого t на выходе из блока.
NIKr0m@nceR, угу. Только вот если написать внутри main:

PHP Code:
...

{
    
Test= new Test();  // создали объект в куче
    
delete t;  // и удалили его
    
std::shared_ptr<Testsh(t);  // создали указатель на этот объект


- то один фиг, деструктор для Test всё равно дважды вызовется... Хотя t на тот момент уже ни на что не ссылается.

Мораль - не использовать смарт-пойнтеры для объектов на стеке (по ссылкам их передавать, и всего делов), ну и не забывать обнулять "обычные" указатели после вызова delete.
(08.05.2012 17:48)Efrit Wrote: [ -> ]Мораль - не использовать смарт-пойнтеры для объектов на стеке
а никто и не собирался Sm
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
Reference URL's