スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

アニメーションを実装できるか・・・!?

先日、「DirectXのアニメーションは理解するのに時間がかかる、扱いが複雑そうだから
もうアニメーションを簡単にするクラスを自作してやる!

と、無謀かもしれない決意をしてしまった訳ですが、今のところ作業は進んでます。
Xファイルの、 最初の"template"の部分を消した部分を読み込む様にしてます。

とりあえず、コンソールアプリケーションで実行したものがこちら。↓
(ついでに読み込んだXファイルも)
【実行画面】
Xファイル読み込み

で、この読み込むプログラムを書いている時に思ったのですが、
2重になっている動的確保って面倒ですね。

例えば下記の様なプログラム。
※実行しないで下さい。
---------------------------------------------------------------
typedef struct{
int x;
int* y;
}Test;


int main(void)
{
Test* test;
test = new Test[2];
test[0].y = new int[2];

delete[] test;

return(0);
}
---------------------------------------------------------------
ポインタを持った構造体を定義し、構造体のポインタを作り、newしてます。
で、その後構造体型のポインタをdelete。

この時、構造体型のポインタをdeleteしても、構造体の中のnewしたメンバは解放されないんですよね。
(上記の例でいくと、int型のポインタ '')

一回、コレで失敗して悲惨な目にあいましたよ。

ただしくはこうです。↓
---------------------------------------------------------------
typedef struct{
int x;
int* y;
}Test;


int main(void)
{
Test* test;
test = new Test[2];
test[0].y = new int[2];

delete[] test[0].y;
delete[] test;

return(0);
}
---------------------------------------------------------------

で、順番を間違えるとまた面倒なことになります。
下記の様にすると、
-----------------
delete[] test;
delete[] test[0].y;
-----------------

構造体型のポインタは先にdeleteされちゃってるもんですから、
構造体型のメンバtest[0].yにアクセスできなくなるんですよね。
つまり、 開放が不可能となります。
(恐らく実行すると、例外が発生すると思います。)

入れ子みたいになっているような動的確保は、
奥の方から順番に開放しないと駄目と言う訳です。
勝手に開放されればいいのに

まぁ、話は戻りますが、とりあえずの目標はテクスチャも読み込めるようにする事です。
あと、企業A社のプログラム作品の課題にはコレを提出しようと思います。
「Xファイルっぽいデータを読み込んで表示できますよ!」みたいな。
うん、それで許してもらおう。

完成に向けて前進!(`・ω・´)*
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

No title

構造体にデストラクタを追記して、そこで解放するようにしては如何でしょうか?

No title

こんな感じ?

#include <iostream>

struct Test
{
public:
int x;
int* y;

public:
Test(void)
{
x = 0;
y = NULL;
}

~Test(void)
{
if (y != NULL)
{
delete[] y;
y = NULL;
std::cout << "delete OK";
}
}
};

void main(void)
{
Test* test = new Test[5];
for (int i = 0; i < 5; ++i)
{
test[i].y = new int[10];
}
delete[] test;
}

No title

おぉ参考となるコード有り難う御座いますm(_ _)m
あまり使っていなかったんですが、C++だと構造体はメンバ関数とかも持てる仕様でしたね。
自分は、コンストラクタ、デストラクタが必要な構造体はclassの中のメンバにして、classのデストラクタで開放、と言う風にしてしまう事が殆どなので、
構造体自体に、デストラクタを付加させる事は無かったです。
(下記の様に↓)
--------------------------------------
typedef struct{
int x;
int* y;
}Test;

class Temp{
public:
Temp():Test構造体のポインタなどを初期化{ }
~Temp(){Test構造体のポインタなどをdelete}
Test* test;
};
--------------------------------------
ともかく、
構造体に、コンストラクタ、デストラクタを追加する方向でやってみますv-290

No title

 えーと、省略されているだけなのかもしれませんが、デストラクタで deleteする場合のコードとしては不足してません?

 あと、二重の newにするくらいなら、外側を std::vectorにすればすっきりすると思います。

No title

ご指摘 有り難う御座いますm(_ _)m
かなり、おおまかにしてしまったので細かい部分は
全部 省いてしまってます。

やっぱり、2重3重の動的確保とかになってくると
コードとしてはあまり綺麗じゃないですし、エラーを誘発しやすいですよね。v-292

構造体型のポインタで動的確保した際に、
構造体のメンバのポインタを初期化し忘れたりすると
deleteする時にバグりますし。
(メンバのポインタにNULLが入っていない為)

ともかく、C++ ベクタの方でも試してみます!v-290
(色んなやり方の実装方法で挑戦)

No title

> おおまかにしてしまったので細かい部分は全部省いてしまってます
 余計な指摘でしたね。
 すみません。


>エラーを誘発
 そうなんですよね。
 なので、これは私のスタイルなのですが、原則として newは使っても全てスマートポインタか std::vectorなどのコンテナに入れて解放はそれらに任せてしまっています。

 かなり楽ですよ。

No title

スマートポインタなどを使うと、自動的に開放してくれるので便利ですねv-290

多分 こういうのは、自分で実装するより
STLコンテナとかを、利用した方が便利 + 安全でしょうね。

自分は まだ理解が浅いので使ってはいないのですが、
ちゃんと利用できるように精進したいと思いますe-454
(クラスなどの便利なものがあっても、 使い方を間違えると大抵ロクな事にならなかったり するので、
ちゃんと把握してから使う必要があったりする)
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。