クラスの解放のタイミング(?)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ダンキヤ

クラスの解放のタイミング(?)

#1

投稿記事 by ダンキヤ » 7年前

現在ダンジョンゲームを作っており、プレイヤーの座標を取るところで悩んでいます。

スポーン位置がランダムという事で、ダンジョン生成時に使用している関数を使いまわしているのですが、プレイヤーのスポーン時に使用すると関数内の変数が初期化(?)されてしまっているのか変な値になってしまいます。

解放のタイミングを間違えていて、プレイヤーの生成時には解放されてしまっているためおかしくなっているのかなと思っています。
deleteを行わず試してみたところ、結果は変わらず値がおかしなままでした(見落としがあった?)

ダンジョンマップの生成が完了した後にプレイヤーの生成を行っています。

解放の他に何か原因は考えられないでしょうか?

また、コードが必要な場合はお申し付けください。

どうぞよろしくお願いします。

ダンキヤ

Re: クラスの解放のタイミング(?)

#2

投稿記事 by ダンキヤ » 7年前

記入漏れです

DXライブラリを使って製作中です。

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

Re: クラスの解放のタイミング(?)

#3

投稿記事 by naohiro19 » 7年前

BoostのSmartPtr(スマートポインター)や
<memory>ヘッダーにあるstd::shared_ptrやstd::unique_ptrを使うことでリソースを自動的に解放してくれます。

龍神録2プログラミングの館にあるプログラムが参考になると思います。

[hr]
Visual Studio 2005/2008/2010では完全にC++11に対応していませんので 代わりに Boostライブラリを使いましょう。

ダンキヤ

Re: クラスの解放のタイミング(?)

#4

投稿記事 by ダンキヤ » 7年前

ごめんなさい。まだもや大事な記入漏れでした><;

shared_ptrとmake_sharedを使って制作中です。ですが、解放のタイミング(参照カウンタが0になる瞬間)が分からないので、プレイヤーの設定の時には自動解放がすんでしまっていたのではないかという事です。

値が変になってしまう原因として、意図しないタイミングでの解放以外何かあるのでしょうか?

TKS

Re: クラスの解放のタイミング(?)

#5

投稿記事 by TKS » 7年前

ブレークポイントを張るなどして、変数の中身がどうなっているかを確認してみては如何でしょうか。
仮に解放済み領域にアクセスして不正値を取得しているとすれば、作為性が無いランダムな値が入っている事でしょう。

100や200のような人為的な値が入っているのならば、値設定の処理自体に問題があると思われます。

ダンキヤ

Re: クラスの解放のタイミング(?)

#6

投稿記事 by ダンキヤ » 7年前

無作為な数字が入っています。

話の流れ的にやはり解放が行われてしまっているようですね><;

shared_ptrの使用をやめて1つずつ追ってみることにします。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: クラスの解放のタイミング(?)

#7

投稿記事 by Dixq (管理人) » 7年前

別のトピックを見ると、インスタンスが異なっていても、値が共有されることを期待しているようでしたので、何か誤解しているんじゃないでしょうか。
shared_ptrを使ったから解放された後の値を参照してしまうなんてこと普通無いですよ。
具体的なコードをはってもらえたら詳しく回答できると思います。

ダンキヤ

Re: クラスの解放のタイミング(?)

#8

投稿記事 by ダンキヤ » 7年前

そうなのです、誤解をしていました。

インスタンスや順番ではなく、もっと根本的なところの理解が及んでいなかったようです。

おっしゃる通り異なったインスタンスで値を共有する方法を知りたいです。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: クラスの解放のタイミング(?)

#9

投稿記事 by Dixq (管理人) » 7年前

別トピックでも書いた通り、static変数を用いればできますが、そもそもそのようなことがしたいと思うこと自体、設計がおかしい可能性が高いです。
先ほどから言っているように質問を具体的にしてもらえたら回答もしやすいです。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: クラスの解放のタイミング(?)

#10

投稿記事 by Dixq (管理人) » 7年前

特定のクラスのインスタンスが他のクラスのインスタンスの中身を知りたいことはあります。
例えば敵クラスがプレイヤークラスの座標を参照したいようなケースはあります。
そんな時は取得するインターフェイスクラスを定義してそれを実装し、
取得したいインスタンスにインターフェイスのポインタを渡して参照させるようにします。
例えばこのように実装します。

コード:

#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;
}

返信

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