読者です 読者をやめる 読者になる 読者になる

はわわーっ

はわわわわっ

[cpp] boost::shared_ptrを使ってみる

cpp

動的にメモリを確保したいときはshared_ptrってのを使うといいらしい。ってことで、ちょっと練習。

まず、クラスを定義してみる。C++よくわかってないので、正直この辺もあんまり自身がない。

#include <boost/shared_ptr.hpp>
#include <iostream>

class MyClass {
public:
    MyClass() : x(9999) {}
    MyClass(int i) : x(i) {}
    void printx() { std::cout << x << std::endl; }
private:
    int x;
};

int main() {
    MyClass myclass1;
    MyClass myclass2(5);

    myclass1.printx();  // 9999
    myclass2.printx();  // 5
}

で、次にこのshared_ptrでMyClassのポインタを使ってみる。

#include <boost/shared_ptr.hpp>
#include <iostream>

class MyClass {
public:
    MyClass() : x(9999) {}
    MyClass(int i) : x(i) {}
    void printx() { std::cout << x << std::endl; }
private:
    int x;
};

int main() {
    boost::shared_ptr<MyClass> myclass_ptr1(new MyClass);
    boost::shared_ptr<MyClass> myclass_ptr2(new MyClass(777));

    myclass_ptr1->printx();  // 9999
    myclass_ptr2->printx();  // 777
}

shared_ptrは参照されている数が0になるとうまいこと後処理をしてくれるらしい。上の例だとmain()を抜けたときにメモリが開放される。

あと、このshared_ptrはvectorとかlistにすることもできる。std::auto_ptrとかboost::scoped_ptrだとできないみたい。

#include <boost/shared_ptr.hpp>
#include <iostream>
#include <vector>

class MyClass {
public:
    MyClass() : x(9999) {}
    MyClass(int i) : x(i) {}
    void printx() { std::cout << x << std::endl; }
private:
    int x;
};

int main() {
    std::vector<boost::shared_ptr<MyClass> > myclass_ptr_vector;

    for (int j = 0; j < 10; j++) {
        boost::shared_ptr<MyClass> myclass_ptr(new MyClass(j));
        myclass_ptr_vector.push_back(myclass_ptr);
    }

    std::vector<boost::shared_ptr<MyClass> >::iterator i = myclass_ptr_vector.begin();
    std::vector<boost::shared_ptr<MyClass> >::iterator iend = myclass_ptr_vector.end();
    while (i != iend) {
        (*i)->printx();
        ++i;
    }
}

なんとなく使い方は分かったような気がする。