ページ 11

シングルトンにおけるメモリアドレスにおいて

Posted: 2011年11月13日(日) 21:46
by koshineight

コード:

class CSingleton
{

   public:

        static CSingleton* getInstance()
        {

            static CSingleton csInst;
            return &csInst;

        }

    private:

        CSingleton() { }
        CSingleton(const CSingleton& cs) { }
        CSingleton& operator = (const CSingleton& cs) {}

}
というコードに対して、

コード:

CSingleton cSingleton01*;
cSingleton01 = CSingleton::getInstance();
CSingleton cSingleton02*;
cSingleton02 = CSingleton::getInstance();
というコードが存在するとします。
この時、cSingleton01とcSingleton02は同じメモリアドレスになりますか?
それとも違うメモリアドレスになりますか?もしそうだとして、違うメモリアドレスだとしても「インスタンスは一つである」ということが保障されていますか?

Re: シングルトンにおけるメモリアドレスにおいて

Posted: 2011年11月13日(日) 22:01
by beatle
関数内のstatic変数の実体は1つしか生成されませんので、CSingleton::getInstance()の戻り値は常に同じになります。

もし仮に異なるアドレスになるとすれば、それははっきり違うインスタンスです。だって指しているオブジェクトが違うのですから。
「違うメモリアドレスで、かつインスタンスとしては同一」という文章は非常に矛盾している気がするのですが、koshineightさんは何を言おうとしていたのでしょうか。

注意したいのが、マルチスレッドの場合にcsInstのコンストラクタが複数回呼び出されることがある、ということです。
詳しくはBinary Hacks #36 「C++でsynchronized methodを書く」を参照してください。

Re: シングルトンにおけるメモリアドレスにおいて

Posted: 2011年11月14日(月) 01:12
by koshineight
回答ありがどうございます。

現在僕はあるクラスをシングルトンとして実装し、他のクラスでメンバ変数へgetInstance()をしています。
本当に一つしかインスタンスが作成されてないのか?ということを確かめたかったため、メンバ関数の中のローカル変数へもgetInstance()をし、それをDrawStringしています。
そしたら、何故かメモリが食い違っていたのでおかしいなと思って質問しました。

Re: シングルトンにおけるメモリアドレスにおいて

Posted: 2011年11月14日(月) 06:34
by beatle
そうですか。それはおかしいですね。
問題のあるソースコードを提示していただけると、もっと詳しい回答ができるかもしれません。

Re: シングルトンにおけるメモリアドレスにおいて

Posted: 2011年11月14日(月) 13:19
by koshineight
回答ありがとうございます。

自分でも調べていじってみたのですが、やはり違うメモリアドレスを指しているようです。
プロジェクト一式をアップします。お手数お掛けしますがチェックをお願いします。

Re: シングルトンにおけるメモリアドレスにおいて

Posted: 2011年11月14日(月) 13:30
by softya(ソフト屋)
このプログラムでは、ポインタ変数のポインタ値(アドレス)ではなくポインタ変数自体のポインタ値(アドレス)を表示しています。this -> kIptとsecは違う変数ですので、ポインタ値(アドレス)はもちろん違います。つまり&が余分です。あと%pを使ってください。

Re: シングルトンにおけるメモリアドレスにおいて

Posted: 2011年11月14日(月) 17:05
by koshineight
ありがとうございました。同一アドレスであることが確認できました。