类初始化过程中的内存重叠



我的问题是我有一个头文件,我存储所有的类,在我的cpp文件中,我有这些类的初始化,初始化不是动态的,我有许多不同的类数组。

现在的问题是,当我开始在我的头扩展类,添加更多的成员和方法,1个特定类的初始化开始抛出断言在我的内存重叠,并建议使用memmove()而不是memcpy(),虽然我在该类中都不使用它们。

我试着用它的降级版本替换这个类,它在旧版本的源代码中工作,但它仍然向我抛出了相同的断言,我不知道代码的哪一部分是相关的,这里是断言在类的初始化中被断言,没有任何指针指向到底是什么错。

这是类的初始化:

Shuriken(cpFloat m,cpVect veloc,cpFloat elast,cpFloat myu) : Spark() , Bang1() , ShurikenFlame()
{
smass = m;
sv = veloc;
se = elast;
su = myu;
ToDraw = false;
Removed = true;
AllocatedBombAnim = false;
DrawFlamedShuriken = false;
DeployFlameBang = false;
PassedLine = false;
hitfruit = false;
FruitIsBeingHit = false;
ToRemoveBody = false;
DummyAdded = false;
HitBossBanana = false;
fruitnum = 11;//11 means it has no fruit
Sec_FlameCounter = 3;
LitShuriken_UVs[0] = CIwFVec2(0, 0);
LitShuriken_UVs[2] = CIwFVec2(1.0/4, 1.0/4);
LitShuriken_UVs[3] = CIwFVec2(1.0/4, 0);
LitShuriken_UVs[1] = CIwFVec2(0, 1.0/4);
Sparkle_UVs[0] = CIwFVec2(0, 0);
Sparkle_UVs[2] = CIwFVec2(1.0/2, 1.0/4);
Sparkle_UVs[3] = CIwFVec2(1.0/2, 0);
Sparkle_UVs[1] = CIwFVec2(0, 1.0/4);
lastPos = cpvzero;
lastAngle = 0;
struct cpVect initShurikenBody_Verts[35] = 
{
    cpv(-128.01,41.26),
    cpv(-58.74,45.42),
    cpv(-47.79,32.04),
    cpv(-40.06,33.94),
    cpv(-20.63,48.29),
    cpv(-16.13,55.67),
    cpv(-25.33,69.7),
    cpv(0,134.67),
    cpv(25.34,70.16),
    cpv(16.14,55.67),
    cpv(20.75,48.1),
    cpv(39.98,34.04),
    cpv(47.96,32.15),
    cpv(58.86,45.38),
    cpv(128.01,41.26),
    cpv(74.55,-2.82),
    cpv(57.95,1.45),
    cpv(52.25,-5.19),
    cpv(45.16,-26.79),
    cpv(45.77,-35.34),
    cpv(61.86,-41.64),
    cpv(79.1,-108.95),
    cpv(20.79,-71.41),
    cpv(19.62,-54.33),
    cpv(11.91,-51.14),
    cpv(-12.02,-51.11),
    cpv(-19.64,-54.26),
    cpv(-20.81,-71.4),
    cpv(-79.11,-108.95),
    cpv(-61.87,-41.6),
    cpv(-45.77,-35.03),
    cpv(-45.18,-26.75),
    cpv(-52.23,-5.35),
    cpv(-57.88,1.31),
    cpv(-74.48,-2.8),
}; 
struct cpVect initShurikenShape_Verts1[5] = 
 {
    cpv(-128.01,41.26),
    cpv(-58.74,45.42),
    cpv(-47.79,32.04),
    cpv(-57.88,1.31),
    cpv(-74.48,-2.8),
 };
struct cpVect initShurikenShape_Verts2[5] = 
 {
    cpv(0,134.67),
    cpv(25.34,70.16),
    cpv(16.14,55.67),
    cpv(-16.13,55.67),
    cpv(-25.33,69.7),
 };
struct cpVect initShurikenShape_Verts3[5] = 
 {
    cpv(47.96,32.15),
    cpv(58.86,45.38),
    cpv(128.01,41.26),
    cpv(74.55,-2.82),
    cpv(57.95,1.45),
 };
struct cpVect initShurikenShape_Verts4[5] = 
 {
    cpv(79.1,-108.95),
    cpv(20.79,-71.41),
    cpv(19.62,-54.33),
    cpv(45.77,-35.34),
    cpv(61.86,-41.64),
 };
struct cpVect initShurikenShape_Verts5[5] = 
 {
    cpv(-79.11,-108.95),
    cpv(-61.87,-41.6),
    cpv(-45.77,-35.03),
    cpv(-19.64,-54.26),
    cpv(-20.81,-71.4),
 };
struct cpVect initShurikenShape_Verts6[4] = 
 {
    cpv(-47.79,32.04),
    cpv(-40.06,33.94),
    cpv(-52.23,-5.35),
    cpv(-57.88,1.31),
 };
struct cpVect initShurikenShape_Verts7[4] = 
 {
    cpv(-20.63,48.29),
    cpv(-16.13,55.67),
    cpv(16.14,55.67),
    cpv(20.75,48.1),
 };
struct cpVect initShurikenShape_Verts8[4] = 
 {
    cpv(39.98,34.04),
    cpv(47.96,32.15),
    cpv(57.95,1.45),
    cpv(52.25,-5.19),
 };
struct cpVect initShurikenShape_Verts9[4] = 
 {
    cpv(45.16,-26.79),
    cpv(45.77,-35.34),
    cpv(19.62,-54.33),
    cpv(11.91,-51.14),
 };
struct cpVect initShurikenShape_Verts10[4] = 
 {
    cpv(-12.02,-51.11),
    cpv(-19.64,-54.26),
    cpv(-45.77,-35.03),
    cpv(-45.18,-26.75),
 };
struct cpVect initShurikenShape_Verts11[10] = 
 {
    cpv(-40.06,33.94),
    cpv(-20.63,48.29),
    cpv(20.75,48.1),
    cpv(39.98,34.04),
    cpv(52.25,-5.19),
    cpv(45.16,-26.79),
    cpv(11.91,-51.14),
    cpv(-12.02,-51.11),
    cpv(-45.18,-26.75),
    cpv(-52.23,-5.35),
 };
for(int i=0;i<5;i++)
    ShurikenShape_Verts1[i] = initShurikenShape_Verts1[i];
for(int i=0;i<5;i++)
    ShurikenShape_Verts2[i] = initShurikenShape_Verts2[i];
for(int i=0;i<5;i++)
    ShurikenShape_Verts3[i] = initShurikenShape_Verts3[i];
for(int i=0;i<5;i++)
    ShurikenShape_Verts4[i] = initShurikenShape_Verts4[i];
for(int i=0;i<5;i++)
    ShurikenShape_Verts5[i] = initShurikenShape_Verts5[i];
for(int i=0;i<4;i++)
    ShurikenShape_Verts6[i] = initShurikenShape_Verts6[i];
for(int i=0;i<4;i++)
    ShurikenShape_Verts7[i] = initShurikenShape_Verts7[i];
for(int i=0;i<4;i++)
    ShurikenShape_Verts8[i] = initShurikenShape_Verts8[i];
for(int i=0;i<4;i++)
    ShurikenShape_Verts9[i] = initShurikenShape_Verts9[i];
for(int i=0;i<4;i++)
    ShurikenShape_Verts10[i] = initShurikenShape_Verts10[i];
for(int i=0;i<10;i++)
    ShurikenShape_Verts11[i] = initShurikenShape_Verts11[i];
for(int i=0;i<35;i++)
    ShurikenBody_Verts[i] = initShurikenBody_Verts[i];
}

我正在使用Visual Studio 2010与Marmalade SDK,我正在用c++编写。

谢谢你的帮助,

安东

好的,那么如果我们假设ShurikenShape_Verts1是一个常规的C风格数组或c++风格的std::array,并且具有类型cpVect, cpVect是一个POD结构体:

for(int i=0;i<5;i++)
    ShurikenShape_Verts1[i] = initShurikenShape_Verts1[i];

可以复制为:

memcpy(ShurikenShape_Verts1, initShurikenShape_Verts1, 
       sizeof(initShurikenShape_Verts1));

然而,我在这里做了一些假设,因为你没有发布足够的代码。我讨厌开始一个"可以张贴这个,你可以张贴"类型的线程,要求大量的其他比特你的代码,但这也意味着我可能没有正确地回答了这个问题,因为我不知道你的cpVect确实是一个POD结构体,例如。

(我会提交评论,但我没有足够的stackoverflow "声誉"来这样做:-()

我会认真地退后一步,看看你为什么一开始就想抄袭这些东西。复制很多东西相对来说比较慢。使用指向现有数组的指针或引用要好得多,这取决于您的风格。

如果你说的"cpVect只是2个浮点数变成一个向量",你的意思是向量,那么不要使用memcpy或其他什么。这只会在以后给你带来堆问题。记住,这些都是在后台进行分配的。如果您使用memcpy,您将获得指向相同内容的两个对象,并且当第一个对象超出作用域时,该内容将被释放。

最新更新