Current time: 02.02.2025, 02:57 Hello There, Guest! (LoginRegister)
Language: english | russian  

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

Posts: 6184
Post: #286

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

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

gamecreator, ну и пусть.


Welcome!
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: 6184
Post: #290

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

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

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

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


Welcome!
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: 6184
Post: #292

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

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


Welcome!
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: 6184
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!
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: 6184
Post: #299

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

PHP Code:
...

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


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

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


Welcome!
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-2025 MyBB Group