C++ を初めて使用し、ベクトルを返す際に問題が発生しました。ブレークポイントを設定すると、配列は正しくなります (クエリから期待されるすべてのオブジェクトが取り込まれています)。しかし、それが返されると、エラーが発生します: EXC_BAD_ACCESS on line m_pComponentContainer->removeAll(); CCNode.cpp から
Cocos2dx フレームワークを広く使用していますが、このクラスには含まれていませんが、これは基本クラス (どの種類の CC オブジェクトからも継承されません) であるため、これは奇妙です。
これは、何かが割り当て解除されているためだと確信しています。ただし、私が言ったように、私は C++ に非常に慣れていないため、問題がどこにあるのかよくわかりません。メモリ管理について心配する前に、もう少し開発を進めたいと思っていました。
int numberOfCards = DatabaseHelper::getNumberOfCards();
//cant be zero
assert(numberOfCards);
std::vector<CardSlot> returnArray(numberOfCards);
sqlite3_stmt * statement;
if (sqlite3_open(this->dbpath.c_str(),&this->cardWarsDB) == SQLITE_OK)
{
const char* query_stmt = "select ID, HP, MP, AbilityText from Cards WHERE ID IN (SELECT DISTINCT cardsID FROM Deck WHERE name = 'All')";
if (sqlite3_prepare_v2(this->cardWarsDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
CardSlot *aCard;
const char* cardID = (const char*)sqlite3_column_text(statement, 0);
const char* cardHP = (const char*)sqlite3_column_text(statement, 1);
const char* cardMP = (const char*)sqlite3_column_text(statement, 2);
const char* cardAbility = (const char*)sqlite3_column_text(statement, 3);
if (cardID != NULL) {
std::string imageName = ".png";
imageName = cardID + imageName;
aCard = (CardSlot *)CardSlot::spriteWithFile(imageName.c_str());
}
if (cardID != NULL) {
aCard->cardID = std::string(cardID);
cocos2d::CCLog("DB returned results, cardID: %s",aCard->cardID.c_str());
}
if (cardHP != NULL) {
aCard->cardHP = std::string(cardHP);
cocos2d::CCLog("DB returned results, cardHP: %s",aCard->cardHP.c_str());
}
if (cardMP != NULL) {
aCard->cardMP = std::string(cardMP);
cocos2d::CCLog("DB returned results, cardMP: %s",aCard->cardMP.c_str());
}
if (cardAbility != NULL) {
aCard->cardAbility = std::string(cardAbility);
cocos2d::CCLog("DB returned results, cardAbility: %s",aCard->cardAbility.c_str());
}
numberOfCards--;
returnArray[numberOfCards] = *aCard;
}
sqlite3_finalize(statement);
}
sqlite3_close(this->cardWarsDB);
return returnArray;
}
スタック トレースのスクリーンショットを次に示します。私はそれを見ていましたが、CardSlot オブジェクトが原因のようです。しかし、それらを「保持」する方法はまだわかりませんが、Cocos のドキュメントを見てみましょう。