我通常在C ++ for Windows中广泛使用struct数组,在构造函数和析构函数中分别通过new和delete分配内存。
这是我的第一个Android应用程序。
应用程序崩溃,自从我将第一个数组从简单中更改后 在头文件中定义为float AccelZ [1000] 用作AccelZ [i]
到头文件中定义的struct数组,并在FormCreate和FormDestroy事件中使用new和delete。 并用作AccelArray [i] - > Z
Android中没有使用struct数组吗?但如果是这种情况,那么我原本期望编译错误。
由于
现在编辑:
在头文件中:
const int MAXTIMESTEPS = 20000;
struct AccelerationRecord
{
float Z;
};
在公共场合下:
AccelerationRecord* Acceleration[MAXTIMESTEPS];
在FormCreate下的.cpp文件中在Windows中我会把它放在构造函数中,但这对Android应用程序不起作用(我是Android应用程序的新手)
void __fastcall TTabbedwithNavigationForm::FormCreate(TObject *Sender)
{
for (int i; i < MAXTIMESTEPS; i++)
Acceleration[i] = new AccelerationRecord;
>>snip other code
}
在FormDestroy下(用于将其放在Windows应用程序中的析构函数中)
void __fastcall TTabbedwithNavigationForm::FormDestroy(TObject *Sender)
{
for (int i; i < MAXTIMESTEPS; i++)
delete Acceleration[i];
}
稍后在应用中,第一次用作
if (MotionSensor1->Sensor-
>AvailableProperties.Contains(TCustomMotionSensor::TProperty::AccelerationZ))
{
lbAccelerationZ->Text = lbAccelerationZ->Text.sprintf(L"Acceleration Z: %6.2f",MotionSensor1->Sensor->AccelerationZ+1);
Counter += 1;
Acceleration[Counter]->Z = MotionSensor1->Sensor->AccelerationZ+1;
//crashes at this line in debug mode
>> snip other code
}
答案 0 :(得分:0)
首先:
for (int i; i < MAXTIMESTEPS; i++)
应该是
for (int i=0; i < MAXTIMESTEPS; i++)
使用未初始化的i
,您可以从界限中访问数组,从而导致崩溃。你也一样:
Counter += 1;
我看到没有绑定检查也没有初始化所以上帝知道Counter
的价值是什么。
第二我更习惯这个:
// "globals"
const int MAXTIMESTEPS = 20000;
struct AccelerationRecord
{
float Z;
};
AccelerationRecord* Acceleration=NULL;
// init
Acceleration = new AccelerationRecord[MAXTIMESTEPS];
// here do your stuff on AccelerationRecord[i]
AccelerationRecord[7].z=-1.5;
// exit
delete[] Acceleration;
单new/delete[]
比为每条记录调用它要好得多,原因有两个。首先,你要减少内存管理器(减少开销),然后通过这种方式获得连续的内存块,并且只记住相同内容的单个指针,而不是20000
使用更少的内存并具有更快的线性访问...