1

次を使用して配列を作成します。

MyClass *myInstance = new MyClass[1];

次に、クラスにデータを入力します。その後、次のように配列を展開します。

MyClass *tempList = new MyClass[myCount+1];
tempList[0] = myInstance[0];
myInstance=tempList;

インデックス 1 から myCount までのデータを入力します。

その後、コールバックで関数を呼び出します。呼び出し前はすべてのデータが正しく、コールバック関数の開始時にデータが失われ、EXC_BAD_ADDRESS. 変数はプライベート変数であるため、クラスの外部からアクセスすることはできません。つまり、コールバック関数を呼び出す関数から変更することはできません。

充填は、MyClass の変数の設定のみで構成されます。しかし、クラスへの参照全体が失われているようです。

このプロジェクトはクロスプラットフォームの iOS/Android プロジェクトであり、C++ でプログラムされ、XCode でテストされています。

私は何か間違ったことをしていますか?

アップデート:

std::vector でやり直したところ、次のようになりました。

.h で次を定義します。

std::vector<MyClass*> myInstances;

.m: 要素を 1 つ追加します

myInstances.push_back(new MyClass());

次に、myClass 内に変数を入力します。その後、次のように myInstances を展開します。

MyClass *tempInstance = myInstances[currentPlayerIndex];
myInstances.clear();
myInstances.push_back(tempInstance);
for (int i=1; i<friends->count()+1; i++)
{
    myInstances.push_back(new MyClass());
    //filling variables, like f.e. myInstances[i]->setScore(1000);
}

まったく同じポイントで、まだ同じエラーが発生しています:(

4

1 に答える 1

2
MyClass *myInstance = new MyClass[1];
// myInstance is a pointer variable which contains
// an address. It points to a memory location at which
// we have an array of ONE MyClass.

MyClass *tempList = new MyClass[myCount+1];
// creates a NEW allocation, without touching the original.
// tempList is now also a pointer variable. It contains
// an address, the address of a different memory location
// at which we now have 2 myClass instances. This is
// NOT the same location.

tempList[0] = myInstance[0];
// the MyClass instances at *myInstance and *tempList
// are now copies of each other, but only the first instances.

myInstance=tempList;
// myInstance is now pointing to tempList, but the array
// of MyClass instances that it pointed to are still
// allocated. Unfortunately, you no-longer have the
// address stored in any variables. This is called a leak.

std::vectorstd::listなどの STL コンテナーのいずれかを調べることを検討する必要があります。動的割り当てを使用する必要がある場合は、std::vector の使用を検討してください。std::unique_ptrを参照してください。

編集:

あなたはコメントであなたが電話していると言います

EziSocialObject::sharedObject()->setFacebookDelegate(this);

これは、呼び出し元の特定のインスタンスのアドレスを使用して setFacebookDelegate を呼び出します。また、シングルトンとして動作していると言いますが、その複数のインスタンスを割り当てています。

MyClass* a = new MyClass;
MyClass* b = new MyClass; // No-longer a singleton.

EziSocialObject::sharedObject()->setFacebookDelegate(a);
// From this point on, a->fbUserPhotoCallback will be called.

コードをざっと見てみると、スレッド化されている可能性があります。これには、複数の、潜在的に同時または重複するリクエストを処理するマネージャー システムがあり、Facebook が更新リクエストへの応答が遅いたびにゲームが停止することは絶対に避けたいと思います。 .

なぜベクトルが必要なのかはまだはっきりしていません.すべてのデータが別の場所に保存されているようで、実際に必要なのは1つのベクトルエントリだけです.他のクラスからデータを取得するだけの機能です. 「MyClass」で利用できるようにしますが、ブリッジまたはルックアップクラス、たとえば astd::map<std::string /*FaceBookID*/, size_t localID>またはstd::map<std::string /*FaceBookID*/, RealClass*>.

次のことを試してみてください。

// enable asserts -- only affects debug build.
#include <assert.h>

// Add a counter to track when we clear the vector,
// and track what the count was last time we called getFacebookPhoto
size_t g_vectorClears = 0;

static const size_t VECTOR_NOT_IN_USE = ~0;
size_t g_vectorUsed = VECTOR_NOT_IN_USE;

// When we clear the vector, check if we are using it.
    assert(g_vectorUsed == VECTOR_NOT_IN_USE);
    ++g_vectorClears;
    g_myInstances.clear();

// When you call getFacebookPhoto, store which clear we were on
    g_vectorUsed = g_vectorClears;
    blah->getFacebookPhoto(...);

// In MyClass->fbUserPhotoCallback, validate:
...
fbUserPhotoCallback(...)
{
    assert(g_vectorUsed == g_vectorClears);
    ...
    // at the end, set g_vectorUsed back to NOT_IN_USE.
    g_vectorUsed = VECTOR_NOT_IN_USE;
}

プラグインがスレッド化されていない場合、残りの可能性は、どこかでベクターのアドレスまたはベクターのデータを渡して、それを破壊している、またはプラグインにメモリ リークがあり、ベクターが踏みつぶされている可能性があります。

さらに支援するには、さらに多くのコードを含める必要があります。

于 2013-09-07T10:47:19.123 に答える