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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
koshineight
記事: 7
登録日時: 14年前
住所: 神奈川県
連絡を取る:

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

#1

投稿記事 by koshineight » 14年前

コード:

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は同じメモリアドレスになりますか?
それとも違うメモリアドレスになりますか?もしそうだとして、違うメモリアドレスだとしても「インスタンスは一つである」ということが保障されていますか?
The computer never makes bugs. Who makes bugs is just human.

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#2

投稿記事 by beatle » 14年前

関数内のstatic変数の実体は1つしか生成されませんので、CSingleton::getInstance()の戻り値は常に同じになります。

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

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

koshineight
記事: 7
登録日時: 14年前
住所: 神奈川県
連絡を取る:

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

#3

投稿記事 by koshineight » 14年前

回答ありがどうございます。

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

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#4

投稿記事 by beatle » 14年前

そうですか。それはおかしいですね。
問題のあるソースコードを提示していただけると、もっと詳しい回答ができるかもしれません。

koshineight
記事: 7
登録日時: 14年前
住所: 神奈川県
連絡を取る:

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

#5

投稿記事 by koshineight » 14年前

回答ありがとうございます。

自分でも調べていじってみたのですが、やはり違うメモリアドレスを指しているようです。
プロジェクト一式をアップします。お手数お掛けしますがチェックをお願いします。
添付ファイル
SimpleSTG.zip
Singleton実装
(5.27 KiB) ダウンロード数: 119 回
The computer never makes bugs. Who makes bugs is just human.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 14年前

このプログラムでは、ポインタ変数のポインタ値(アドレス)ではなくポインタ変数自体のポインタ値(アドレス)を表示しています。this -> kIptとsecは違う変数ですので、ポインタ値(アドレス)はもちろん違います。つまり&が余分です。あと%pを使ってください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

koshineight
記事: 7
登録日時: 14年前
住所: 神奈川県
連絡を取る:

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

#7

投稿記事 by koshineight » 14年前

ありがとうございました。同一アドレスであることが確認できました。
The computer never makes bugs. Who makes bugs is just human.

閉鎖

“C言語何でも質問掲示板” へ戻る