Current time: 21.04.2024, 04:45 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
С++, общая тема
Author Message
Efrit Offline
Administrators

Posts: 6183
Post: #286

packa Wrote:Вот именно поэтому я предпочитаю терроризировать живых людей, а не находить не пойми-что в гугле)

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

gamecreator, ну и пусть.


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
03.05.2012 22:32
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #287

Вообще, есть замечательный сайт на котором про стандарт написано неплохо - http://www.cplusplus.com.
Насчёт терроризирования людей - могу посоветовать решать проблемы в он-лайн режиме. В том числе, возникающие в процессе изучения вопросы лучше задавать так чтобы быстро получать ответ. Это конечно замечательный форум, но я, к примеру, куда быстрее отвечу на вопрос по аське или контакту нежели тут и мне кажется, что это будет эффективнее. вот.
p.s. в принципе, на некоторые вопросы я готов отвечать, контакты могу по личке кинуть (если их тут в профиле нет Sm)
03.05.2012 23:20
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #288

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

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


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
04.05.2012 17:03
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #289

Ты не столько доставатель, сколько не умеешь (или не хочешь тратить на это время) правильно формулировать вопросы и задачи.
04.05.2012 17:31
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #290

Впервые сам задам сюда вопрос.

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

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

P.S. До этого не приходилось пользоваться смарт-пойнтерами внутри классов, применял их лишь на уровне функций. Внутри классов всегда юзал обычные сишные указатели - да и, всё-таки, редко приходится выделять память в куче внутри какого-то класса...


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
07.05.2012 16:14
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #291

у меня нет std::shared_ptr и в стандарте я его не нашёл. с другой стороны, есть boost::shared_ptr но он вроде работает немного иначе. если интересует. могу бустовый глянуть.
07.05.2012 22:21
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #292

Это в C++11 shared_ptr находится прямо в std:: - и, соответственно, нужно просто инклудить #include <memory>.
А в C++03, shared_ptr находится уже в std::tr1:: - и поэтому инклудить нужно #include <tr1/memory>.

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


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
07.05.2012 22:35
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #293

Во-первых, tr1 у меня тоже нету Bad
Во-вторых, http://ru.wikipedia.org/wiki/C%2B%2B11#....0.B8.D1.8F может поможет.
В-третьих, я так понимаю что неважно, что буст. Неэффективный но рабочий способ с явным вызовом конструктора:
sh_ptr = boost::shared_ptr<int>(new int(42));
07.05.2012 23:34
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #294

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


Почему деструктор в первом случае вызывается дважды, а не один раз? Ведь никакого копирования, как видно из вывода, не было... Неужели компилятор вначале пытается освободить всё, что содержится "внутри указателя" - а лишь потом удаляет "обычные" объекты со стека?


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
08.05.2012 00:28
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #295

(08.05.2012 00:28)Efrit Wrote:  
NIKr0m@nceR Wrote:Во-первых, tr1 у меня тоже нету
Странно. Что ж это за компилятор такой? 118

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

Efrit, скомипилируй с листингом кода на асме и посмотри где происходит второй вызов деструктора.
(This post was last modified: 08.05.2012 00:53 by etoprostoya.)
08.05.2012 00:50
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #296

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 и указателя. вроде так и должно быть.
(This post was last modified: 08.05.2012 01:57 by NIKr0m@nceR.)
08.05.2012 01:08
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #297

(08.05.2012 00:28)Efrit Wrote:  Почему деструктор в первом случае вызывается дважды, а не один раз? Ведь никакого копирования, как видно из вывода, не было...
конструктор указателя может работать напрямую с памятью в обход конструктора копирования


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
08.05.2012 17:10
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #298

Нет. Там дело именно в том, что вызывается деструктор указателя, который вызывает деструктор указываемого объекта, а потом вызывает деструктор самого t на выходе из блока.
08.05.2012 17:36
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #299

NIKr0m@nceR, угу. Только вот если написать внутри main:

PHP Code:
...

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


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

Мораль - не использовать смарт-пойнтеры для объектов на стеке (по ссылкам их передавать, и всего делов), ну и не забывать обнулять "обычные" указатели после вызова delete.


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
08.05.2012 17:48
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #300

(08.05.2012 17:48)Efrit Wrote:  Мораль - не использовать смарт-пойнтеры для объектов на стеке
а никто и не собирался Sm


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
08.05.2012 17:57
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group