数组已删除或已损坏

时间:2013-09-07 10:35:32

标签: c++ ios arrays

我用:

创建一个数组
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);
}

我仍然得到同样的错误,恰好在同一点:(

1 个答案:

答案 0 :(得分: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.

您应该考虑查看其中一个STL容器,例如std::vectorstd::list。如果需要使用动态分配,请考虑使用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响应缓慢时都停止刷新请求。

我仍然不清楚为什么你需要矢量 - 你似乎把所有的数据存储在其他地方,而你实际上只需要一个矢量条目,它的唯一功能似乎是从某些数据中获取数据其他类,并使其可用于“MyClass”,但似乎你应该能够通过桥或查找类,例如std::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;
}

如果插件没有线程,那么剩下的可能性就是你传递了向量的地址或向量的数据并且你正在破坏它,或者插件有一个内存泄漏导致它踩你的矢量。

为了进一步提供帮助,您需要添加更多代码。