• ベストアンサー

COMオブジェクトの参照カウントついて

COMオブジェクトの参照カウントついて 例えばDirectX9で device->CreateTexture(&texture); // textureの参照カウント+1 このtextureを複数のクラスが所有した場合、コピー時にAddRefしなくてはいけないのでしょうか? CreateTextureをしたクラスが責任を持って終了時にReleaseをしていれば問題ないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんにちは。  「device->CreateTexture(&texture)を行うクラス」と、「textureを所有する複数のクラス」が全く別の場合、AddRef()の必要はありません。  例えば、Gameクラスが「device->CreateTexture(&texture)」と「texture->Release()」を行い、複数のMonsterクラスが「textureを利用する」場合などです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 参照カウントについてその2

    参照カウントについて聞きたいのですが、これは、同じオブジェクトへのポインタがシステム全体にいくつあるかを数えるのでしょうか?例えば、ポインタAとポインタBがある時、オブジェクトCにポインタAとポインタBが指しているということでよろしいのでしょうか?

  • Vista チェスゲーム(ChessTitans)が起動できません

    久しぶりにチェスゲームをやろうとしたら次のメッセージが出て開けません、対処方法を教えてください。 テクスチャが見つかりませんでした。 [Media¥TableWood.dds] D3Dデバイスに非ゼロの参照カウントがあります。 これはオブジェクトのいくつかがリリースされていないこと を示します。 Direct3Dデバイスオブジェクトの作成に失敗しました。 上記メッセージを2度繰返し閉じてしまいます。

  • オブジェクトの参照を返す関数の扱い

    オブジェクトの作成と関数との関係を勉強していますが参照の使い方に関して質問させていただきたいと思います。 以下のような簡単なプログラムを作りました。 myclass.cpp myclass.h で記述されたクラスmyclassは整数を一つ持ち、show_value関数でその整数を表示し、say_heyで"hey"という文字を出力するというものです。 このクラスを利用するプログラムとしてmain.cppをつくりました。このなかには2つの関数が使われます。 -オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj)   -オブジェクトをつくりそれの参照を返す関数(return_ref_obj) これらの関数を用いてオブジェクトをつくり、そのオブジェクトを戻り値としてmainのなかでオブジェクトのshow_value関数で保持する整数を表示する、というものです。 myclass.h-------------------------------- class Myclass{ public: int my_int; Myclass(); ~Myclass(); void show_value(); void say_hey(); }; myclass.cpp---------------------------------- #include "myclass.h" #include <iostream> using namespace std; Myclass::Myclass(){}; Myclass::~Myclass(){}; void Myclass::show_value(){ printf("%d\n", my_int); } void Myclass::say_hey(){ printf("hey\n"); } main.cpp------------ #include <iostream> #include "myclass.h" using namespace std; //オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj)   Myclass return_obj(int int_in){ Myclass myobject; myobject.my_int = int_in; //引数をオブジェクトのmy_intに渡す return myobject; } //オブジェクトをつくりそれの参照を返す関数(return_ref_obj) Myclass& return_ref_obj(int int_in2){ Myclass myobject; myobject.my_int = int_in2;   //引数をオブジェクトのmy_intに渡す Myclass& ref_of_myclass = myobject; return ref_of_myclass; } void main(){ Myclass returned_obj = return_obj(1); //関数に1を渡し、1を保持するオブジェクトを作成 returned_obj.show_value(); //整数(1)表示 returned_obj.say_hey(); Myclass& ref_obj = return_ref_obj(2); //関数に2を渡し、2を保持するオブジェクトを作成し参照として受け取る ref_obj.show_value(); //整数(2)表示 ref_obj.say_hey(); } プログラムを実行した出力------------------- 1 hey -858993460 hey このようにオブジェクト自体を返してコピーしたもの(return_obj使用)はshow_valueでただしくオブジェクトに保持された数が表示されますが 参照でオブジェクトを返したもの(return_ref_obj使用)はアドレスのような数列が表示されます。 質問A これはオブジェクトの参照を返す関数(return_ref_obj)でオブジェクトを作成しても、そのオブジェクトが関数の中でのみ実在しており、関数がおわるとその実体がなくなるためではないかと解釈しているのですがそれで正しいでしょうか? 質問B 関数でオブジェクトを作成してそれをプログラム本体に渡すときはreturn_objのようにオブジェクト自体をコピーしなければ参照などで渡すことはできないのでしょうか? クラスと参照自体勉強を始めたばかりで色々と初歩的な間違いもあるとは思いますが、よろしくお願いします

  • サブクラス型オブジェクトをスーパークラス方に代入

    ある所で下記のような継承についての記述をみつけました。 ----------------------------------------------------------------------------- 継承の目的は、あるクラスで実装したメソッドなどの機能を利用して、 さらに実装を追加する差分コーディングです。 一つのクラスから複数のサブクラスを作ることも良くあります。 このような時、それらのサブクラス型オブジェクトの参照を代入できる変数として、 スーパークラス型変数を使うことがしばしばあります。 ----------------------------------------------------------------------------- サブクラス型オブジェクトの参照を代入できる変数として、 スーパークラス型変数を使うことがある、と いうのはどういった場合に使うのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • パワーポイントでオブジェクトのコピーのやり方

    (1)パワーポイント2002でオブジェクトのコピー先を コピー元のオブジェクトの真上にコピーしたい時 どうすればいいのでしょうか? ショートカットキーもありますか? (2)複数のオブジェクトを均等配置したい時 簡単な方法はありますか?

  • テキストをオブジェクトとして貼り付ける方法

    こんにちは、以下のようなことがしたいと考えておりますが、知見のある方がいらっしゃいましたら、教えていただけるとうれしいです! ・使用するアプリケーションは、Windows Office365(Excel) ・複数行あるテキストをコピーし、Excel上にオブジェクトとして貼り付けたい(添付画像参照) ※例えば、画像の左の4セルをコピーして、右のオブジェクトとして貼り付ける方法狩りしたいです。 目的:今リストアップされているタスクを、付箋のようなオブジェクトに変換して、グルーピングをして優先度付をしたいのです。そのため、上記伺いました(以前、どこかのサイトでやり方をみたような気がしていますが、、、探しても見つからないので、伺いました)

  • 参照メンバを持つクラス

    ClassAとClassBにCMyDataオブジェクトを渡したいのですが、メモリ上に同じデータのコピーを作りたくないので、コンストラクタがCMyDataの参照を受け取る設計にしました。こうすることで、CMyDataの実体はメモリ上に1つしか存在しないことになります。 ただ、クラスが、自身が管理していない外部領域にあるデータへの参照を使って仕事をするというのに違和感を感じます。 完全コンストラクタというデザインパターンがあって、クラスのインスタンスを生成する時に必要な全てのデータを渡すのが正しい流儀だそうです。 しかしこのClassA(B)の設計では、ClassA(B)の寿命が終わるまで参照先のデータが生きているとは限りません。もっといい設計はないでしょうか?ちなみにCMyDataは実際にはかなり大きなデータで、一時的であってもコピーを複数持ちたくないのです。ClassAとClassBは、実際は他のデータも参照するため1つのクラスにはしたくないのです。 class CMyData { // 色々なデータ }; class CMain { CMyData* myData; // ファイルからデータを読み込んで生成 ClassA* objA; ClassB* objB; void ReadFile() { myData = new CMyData(); // ファイルからデータを読み込みCMyData構築 } void Init() { ReadFile(); objA = new ClassA(*myData); // 自身のメンバ変数の参照でClassAを構築 objB = new ClassB(*myData); } void DoProcess() { Init(); // 実行は一度だけ objA->hoge(); // ClassAに仕事をさせる objB->foo(); // ClassBに仕事をさせる } } class ClassA { CMyData& m_data; public: ClassA(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void hoge(); } class ClassB { CMyData& m_data; public: ClassB(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void foo(); }

  • 可変長配列に格納されたオブジェクトの参照

    「name」、「sex」などのデータがあり、 そのデータをHumanオブジェクトとして、可変長配列(humanArray)に格納してあります。 humanArray.add( new Human( name, sex ) );  // このような感じでしょうか。 標準入力から「name」が入力されると、オブジェクトを参照し、 HumanArrayに格納されているHumanオブジェクトの「name」データを一つ一つ比較して、 一致したら配列の要素をすべて出力する。 というプログラムを作りたいのです。 問題としているのは、 一致するかの照合処理を別のクラスで行うので、 nameを処理を行うクラスに渡す必要がありますが、 可変長配列のi番地に入っているオブジェクトのnameを 得るための方法がわかりません。 Humanクラスに public static String throwName() { return name; } のようなクラスを作って、 処理を行うクラスで、 String name = humanArray.get(i).throwCode(); というような処理を行うイメージなのですが・・・。 どのようにすれば良いのかご教授ください。 どのように質問をすれば良いのかも良くわからないので情報が少ないやもしれません その時は遠慮なく「追加情報が欲しい。」と仰ってください。 例 -----配列の内容----- 阿部 男 -------------------- 馬場 女 -------------------- 千葉 女 -------------------- 標準入力:馬場(name) -------Humanクラスの内容-------- class Human { private String name; private String sex; public Human( String nm, String s ) { name = nm; sex = s; } public static void showArticle() { System.out.println(name); System.out.println(sex); } }

    • ベストアンサー
    • Java
  • C++でのクラスオブジェクトの破棄

    こんにちは。 C++では、プログラムの終了時に、全てのクラスオブジェクトは、デストラクタが呼び出されて破棄されますが、プログラムの途中で、クラスオブジェクトを明示的に破棄する方法はあるのでしょうか? 例えば、new演算子によってメモリを動的に割り当てたポインタなら、delete演算子で破棄できますが、 クラスオブジェクトにdelete演算子は使えないようです。 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。

  • COMコンポーネントの構造の本質的理解ができない

    プログラミングを始めて間もない初心者です。 windowsアプリケーションを制御対象として扱おうと、win32oleライブラリをrequireしてCOMコンポーネントを扱う方法をネット上で色々調べてみたのですがどうも腑に落ちない点・分からない点があるので質問します。 rubyリファレンスマニュアルからリンクされているサイト(http://jp.rubyist.net/magazine/?0003-Win32OLE)において、以下のような記述があります。 >COM ではインスタンスを生成するときに「COM コンポーネント」を指 >定するための ProgID を引数として WIN32OLE.new メソッドを実行し >ます。 COM コンポーネントとは、Windows に登録された、ある機能 >(たとえば、IE や MS Office の制御機能) を提供するためのもので >す。この「COM コンポーネント」を利用して作成したインスタンス を>「COM オブジェクト」とこの記事では呼んでいます。 COM オブジェク>トを作成した後は、その COM オブジェクトで定義されている「メソッ>ド」を実行することでそのコンポーネントが提供する機能を実現する >ことができます。 この文に従えば、作成したCOMオブジェクトを扱う方法を知るためにはCOMオブジェクトで定義されているメソッドを参照すれば良いこととなります。そこで自分もWIN32OLE.new("InternetExplorer.Application") によって得たCOMオブジェクトにWIN32OLE.ole_methodsを適用することでメソッドの一覧を取得しましたが、前述のサイトで紹介されているie.document.all.Item()というメソッドを探してみてもどこにも見つかりません。 これはどういうことなのかと思い、ネット上で色々とCOMとは何か、タイプライブラリとは何かなどを調べて見ましたが、いまだCOMの全体像の把握ができません。 たとえばrubyの場合、あるオブジェクトに対して使えるメソッドというのはそのオブジェクトが該当するクラスに於いて定義されているメソッド((1))及びkernelモジュールで定義されている組み込みメソッド((2))ですよね。 (初心者なのでこの理解にも間違いがあるかもしれませんがその場合はご指摘お願いします) このような考え方でいくとWIN32OLE.ole_methodsによって取得したメソッドの一覧は(1)にあたり、document.all.Item()というのは(2)にあたるのではないかという考えもできるかと思うのですが誰か正しい理解をご教授いただきたいです。 質問が長くなってしまいましたがie.document.all.Item()というメソッドがどこに定義されているのか、そういったメソッドの定義場所はCOMにおいてどのように見つけるのか、そこだけでもいいのでよろしくお願いします。

    • ベストアンサー
    • Ruby
このQ&Aのポイント
  • 母親が死んで幽霊になる夢の意味とは一体何なのでしょうか?夢の中では、母親が亡くなっていて幽霊として私にだけ姿を見せる状態で行動しています。この夢は一体何を意味しているのでしょうか?
  • 私は普段あまり母親に甘えることがありませんが、夢の中ではとても甘えていて、一緒に行動したり質問したりしています。また、母親も優しく接してくれています。この夢の内容にはどんな意味があるのでしょうか?
  • 最近、母親に怒られることがあり、その時には一時的な感情とは言え、母親に早く死んでほしいと思ってしまいました。また、普段は甘えることをしないのですが、甘えたいという気持ちも抱いていました。このような状況で見た夢にはどんな意味があるのでしょうか?
回答を見る