C++ 类初始化中的内存重叠

C++ 类初始化中的内存重叠,c++,memory,overlap,marmalade,C++,Memory,Overlap,Marmalade,我的问题是我有一个头文件,其中存储了我所有的类,在我的cpp文件中,我对这些类进行了初始化,初始化不是动态的,我有许多不同类的数组 现在的问题是,当我开始扩展标题中的类,添加更多的成员和方法时,1个特定类的初始化开始向我抛出内存重叠的断言,并建议使用memmove而不是memcpy,尽管我在该类中都没有使用它们 我试着用一个降级版本的类替换这个类,这个版本在我的源代码的旧版本中运行,但它仍然向我抛出了相同的断言我不知道代码的哪一部分是相关的,这里是断言在类的初始化中被断言,没有任何指向到底是什么

我的问题是我有一个头文件,其中存储了我所有的类,在我的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];
}
我使用VisualStudio 2010和MalMaldSDK,我用C++编写。 谢谢你的帮助

Anton < /P> < P> OK,所以如果我们假设SurikKeNeSeEnViTS1是一个规则的C风格数组或C++风格的STD::数组,它具有CPVECT类型,CPVECT是一个POD结构:

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

然而,我在这里做了一些假设,因为您没有发布足够的代码。我不想开始一个can-post-this,can-post-this类型的线程,询问大量代码的其他位,但这也意味着我可能没有正确回答这个问题,因为我不确定你的cpVect是否确实是一个POD结构,例如

我会提交评论,但我没有足够的stackoverflow声誉:-

我会认真地退后一步,看看你为什么要复制这些东西。复制大量内容相对较慢。最好使用指向现有数组的指针或引用,这取决于您的样式


如果cpVect只是将两个浮点数组合成一个向量,那么不要使用memcpy或其他任何东西。这将在以后给您带来堆问题。请记住,这些工作是通过幕后分配来完成的。如果使用memcpy,您将获得指向同一内容的两个对象,当第一个对象超出范围时,该内容将被释放。

如果看不到源代码,我们如何帮助?您是否在任何地方调用std::copy?它的实现可能使用memcpy.mm不,我没有使用std::copy@user2382170,发布代码,这样我们就不用猜了。伙计们,代码就这么简单,只是初始化是我的问题,我将这个类作为数组初始化了10次,从第一个对象开始,我得到了一个重叠的断言,编译器说在这个类初始化时调用memcpy很有趣,尽管我找不到它,但我使用花栗鼠引擎作为我的2d物理引擎,它是用C编写的,我不知道这些是如何使用memcpy的,我会尝试深入挖掘,很抱歉信息不足。首先非常感谢你的回答,好的,ShurikenShape_Verts1是一个简单的C数组,而cpVect只是2个浮点数组成一个向量类型,所以我猜它的POD对吗?如果我错了,请纠正我,我的断言声明我应该使用memove而不是memcpy,memcpy会修复我的重叠断言吗?据我所知,使用memmove更好,无论如何,我明天早上会尝试一下,希望它能解决我的问题,再次感谢你的帮助如果有重叠的地方,我在已经发布的代码中看不到它。例如,memmove适用于需要扩展字符串的情况,因此需要执行memmove&str[10]、&str[12]、strlenstr-10;-换句话说,拷贝的开始和结束都在同一个内存块中,因此我们不能将源中的所有内容直接显示到目标中。
memcpy(ShurikenShape_Verts1, initShurikenShape_Verts1, 
       sizeof(initShurikenShape_Verts1));