LINUX.ORG.RU

[shared_ptr] не работает или я кривой?


0

1

h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <boost/shared_ptr.hpp>
#include <vector>
using namespace std;
using namespace boost;

namespace Ui {
    class MainWindow;
}



class CTst
{
public:
    int i;
    ~CTst(){}
};

typedef shared_ptr<CTst> pCTst;

class CTsts
{
public:
    vector<pCTst> tsts;
    CTsts();
    ~CTsts();
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    shared_ptr<CTsts> base;
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"


CTsts::CTsts(){
    for(int i=0;i<5000000;i++)
    {
        pCTst ttst(new CTst());
        tsts.push_back(ttst);
    }
}

CTsts::~CTsts()
{
    for(int i=0;i<tsts.size();i++)
        ((pCTst)tsts.at(i)).reset();
    tsts.clear();
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    shared_ptr<CTsts> tbase(new CTsts());
    base = tbase;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    base.reset();
}

отжирает 250 метров, при нажатии на кнопку (очистить объект) остается отжирать 200 метров ЧЯДНТ???

Валгриндом прогони. Сам факт удаления куска памяти ещё не означает возвращение его операционной системе.

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

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

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

>это же не .NET где ресурсы возвращаются в тот момент когда их нехватает

В линуксе в общем-то точно так и происходит. Если есть учечка, ее покажет valgrind.

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

>дык ведь это же умный указатель!

И что? Он оперирует теми же delete/free/etc, а детали я тебе в первом же комменте раскрыл

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

дык ведь это же умный указатель!

не настолько умный. к счастью

jtootf ★★★★★ ()

Все делаешь так, если не считать того, что в Qt есть свои контейнеры и «умные указатели». Вся эта мешанина из STL, boost и Qt ужасно выглядит.

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

Слишком близко к сердцу все принимаешь. Если ты справляешься и без умных указателей, то никто и не просит тебя их использовать. Я, например, довольно редко их использую.

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

хорошо надо нам отказаться от удаления ресурса в конце если дошли до конца функции например а мы имеем костыли умные указатели из буста этого не умеют или я ненашел потом надо нам выполнить произвольную функцию с произвольными аргументами как cleanup code опять же буст костыль плюс буст бинд страшное говно получится лучше тогда уж LOKI_ON_BLOCK_EXIT или надо нам выполнить кусок кода как cleanup code гарантированно если возникнет любое исключение сдесь они вообще бессильны кое что может BOOST_SCOPE_EXIT и все. а что нам дают умные указатели ? убогое удаление в простейших ситуациях    

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

особенно интересно смотреть как плюсисты некоторые понапишут говна с бустами биндами и шаред поинтерами и думают это хороший код а смотрится он как самое сраное говно уродливый синтаксис тошнит от него

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

Не совсем верно. Если вы заметили, то необходимым условием работы такого указателя это отказ вообще от использования обычных (только shared или weak, правда про последнее не уверен).

Дело в том, что подсчет ссылок ведется не внутри объекта.

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

в C++ ничего нет для работы с типами в рантайме никаких красивых решений высокоуровневых не сделаеш страшный низкоуровневый уродец который сука еще убрал такую няшную возможность как void* -> sometype* из Си и по малейшему поводу на низком уровне при работе с системным api заставляет делать явный кастинг (потому что api системное расчитано на Си для красивого глазу кода) смотрится как говно какой к черту язык удобный для системного программирования ? смотриш на эти касты НЕОБХОДИМЫЕ и свой код же не нравится смотрится как говно и при этом в рантайме никакой динамической типизации намного более развитой чем сейчас нет а хочется

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

вряд ли - тот хотя бы умеет свои мысли связано выражать

anonymous ()

> typedef shared_ptr<CTst> pCTst;

vector<pCTst> tsts;


А что, этот указатель можно заворачивать в вектор? Тут нет той же проблемы, что и у std::vector< std::auto_ptr<obj> > ?

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

Практически в любой программе на C++, имеющей дело с исключениями, например.

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

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

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

А вообще потестируй вручную. поставь бряки в деструктор

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

да хз, было как-то давно много юзал c#, потом как то в c++ было не уются, половину забыл, путал... Поэтому я как-то предпочитаю не изменять c++. Qt очень нпавится

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

> auto_ptr тоже можно вроде typedef-ом обвернуть.. и усё.

При чем тут typedef? Почитайте, почему auto_ptr нельзя заворачивать в контейнер.

andreyu ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.