現在ダンジョンゲームを作っており、プレイヤーの座標を取るところで悩んでいます。
スポーン位置がランダムという事で、ダンジョン生成時に使用している関数を使いまわしているのですが、プレイヤーのスポーン時に使用すると関数内の変数が初期化(?)されてしまっているのか変な値になってしまいます。
解放のタイミングを間違えていて、プレイヤーの生成時には解放されてしまっているためおかしくなっているのかなと思っています。
deleteを行わず試してみたところ、結果は変わらず値がおかしなままでした(見落としがあった?)
ダンジョンマップの生成が完了した後にプレイヤーの生成を行っています。
解放の他に何か原因は考えられないでしょうか?
また、コードが必要な場合はお申し付けください。
どうぞよろしくお願いします。
クラスの解放のタイミング(?)
Re: クラスの解放のタイミング(?)
BoostのSmartPtr(スマートポインター)や
<memory>ヘッダーにあるstd::shared_ptrやstd::unique_ptrを使うことでリソースを自動的に解放してくれます。
龍神録2プログラミングの館にあるプログラムが参考になると思います。
[hr]
Visual Studio 2005/2008/2010では完全にC++11に対応していませんので 代わりに Boostライブラリを使いましょう。
<memory>ヘッダーにあるstd::shared_ptrやstd::unique_ptrを使うことでリソースを自動的に解放してくれます。
龍神録2プログラミングの館にあるプログラムが参考になると思います。
[hr]
Visual Studio 2005/2008/2010では完全にC++11に対応していませんので 代わりに Boostライブラリを使いましょう。
Re: クラスの解放のタイミング(?)
ごめんなさい。まだもや大事な記入漏れでした><;
shared_ptrとmake_sharedを使って制作中です。ですが、解放のタイミング(参照カウンタが0になる瞬間)が分からないので、プレイヤーの設定の時には自動解放がすんでしまっていたのではないかという事です。
値が変になってしまう原因として、意図しないタイミングでの解放以外何かあるのでしょうか?
shared_ptrとmake_sharedを使って制作中です。ですが、解放のタイミング(参照カウンタが0になる瞬間)が分からないので、プレイヤーの設定の時には自動解放がすんでしまっていたのではないかという事です。
値が変になってしまう原因として、意図しないタイミングでの解放以外何かあるのでしょうか?
Re: クラスの解放のタイミング(?)
ブレークポイントを張るなどして、変数の中身がどうなっているかを確認してみては如何でしょうか。
仮に解放済み領域にアクセスして不正値を取得しているとすれば、作為性が無いランダムな値が入っている事でしょう。
100や200のような人為的な値が入っているのならば、値設定の処理自体に問題があると思われます。
仮に解放済み領域にアクセスして不正値を取得しているとすれば、作為性が無いランダムな値が入っている事でしょう。
100や200のような人為的な値が入っているのならば、値設定の処理自体に問題があると思われます。
Re: クラスの解放のタイミング(?)
無作為な数字が入っています。
話の流れ的にやはり解放が行われてしまっているようですね><;
shared_ptrの使用をやめて1つずつ追ってみることにします。
話の流れ的にやはり解放が行われてしまっているようですね><;
shared_ptrの使用をやめて1つずつ追ってみることにします。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: クラスの解放のタイミング(?)
別のトピックを見ると、インスタンスが異なっていても、値が共有されることを期待しているようでしたので、何か誤解しているんじゃないでしょうか。
shared_ptrを使ったから解放された後の値を参照してしまうなんてこと普通無いですよ。
具体的なコードをはってもらえたら詳しく回答できると思います。
shared_ptrを使ったから解放された後の値を参照してしまうなんてこと普通無いですよ。
具体的なコードをはってもらえたら詳しく回答できると思います。
Re: クラスの解放のタイミング(?)
そうなのです、誤解をしていました。
インスタンスや順番ではなく、もっと根本的なところの理解が及んでいなかったようです。
おっしゃる通り異なったインスタンスで値を共有する方法を知りたいです。
インスタンスや順番ではなく、もっと根本的なところの理解が及んでいなかったようです。
おっしゃる通り異なったインスタンスで値を共有する方法を知りたいです。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: クラスの解放のタイミング(?)
別トピックでも書いた通り、static変数を用いればできますが、そもそもそのようなことがしたいと思うこと自体、設計がおかしい可能性が高いです。
先ほどから言っているように質問を具体的にしてもらえたら回答もしやすいです。
先ほどから言っているように質問を具体的にしてもらえたら回答もしやすいです。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: クラスの解放のタイミング(?)
特定のクラスのインスタンスが他のクラスのインスタンスの中身を知りたいことはあります。
例えば敵クラスがプレイヤークラスの座標を参照したいようなケースはあります。
そんな時は取得するインターフェイスクラスを定義してそれを実装し、
取得したいインスタンスにインターフェイスのポインタを渡して参照させるようにします。
例えばこのように実装します。
例えば敵クラスがプレイヤークラスの座標を参照したいようなケースはあります。
そんな時は取得するインターフェイスクラスを定義してそれを実装し、
取得したいインスタンスにインターフェイスのポインタを渡して参照させるようにします。
例えばこのように実装します。
#include<iostream>
class IGetter {
public:
virtual ~IGetter() = default;
virtual int getX() const = 0;
};
class Player : public IGetter {
public:
Player() : _x(100) {}
virtual ~Player() = default;
int getX() const override {
return _x;
}
private:
int _x;
};
class Enemy {
public:
Enemy(const IGetter* impl) : _impl(impl) {}
virtual ~Enemy() = default;
void show() const {
std::cout << _impl->getX() << std::endl;
}
private:
const IGetter* _impl;
};
int main() {
Player *player = new Player();
Enemy *enemy = new Enemy(dynamic_cast<const IGetter*>(player));
enemy->show();
delete enemy;
delete player;
}