【问题标题】:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse error Visual Studio 2012_BLOCK_TYPE_IS_VALID(pHead->nBlockUse 错误 Visual Studio 2012
【发布时间】:2015-02-11 03:49:34
【问题描述】:

当我尝试删除指针内存时,我遇到了 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 错误。我已经检查了代码中的其他位置,似乎我没有重复删除。

谁能指导一下..

enum SHAPE_TYPES {RECTANGLE, TRIANGLE, CIRCLE};
map<SHAPE_TYPES,vector<Shape *>> shapeMap;

vector<Shape *>rectVector;
shapeMap.insert(pair<SHAPE_TYPES, vector<Shape*>>(RECTANGLE,rectVector));


map<SHAPE_TYPES,vector<Shape *>>::iterator mapIter;
mapIter = shapeMap.find(RECTANGLE);
        if (mapIter != shapeMap.end())
        {
            // create the shape
            RandomAttributes(R[shapes]);  
             // the key was found, so add data 
            shapePtr = R;
            mapIter->second.push_back(shapePtr);
        }

稍后

map<SHAPE_TYPES,vector<Shape *>>::iterator mapIter;
mapIter = shapeMap.find(RECTANGLE);
        if (mapIter != shapeMap.end())
        {
             if ( !mapIter->second.empty() )
              {
                    mapIter->second.back()->Draw();

                  delete mapIter->second.back();  // -- error causing line
                  mapIter->second.pop_back();
                 }
            }

【问题讨论】:

  • 什么是Rshapes 是什么? RandomAttributes 是做什么的?你能创建一个Minimal, Complete, and Verifiable example 给我们看看吗?
  • R 是 Rectangle 类的对象。形状只是 for 循环中的一个计数器,我没有放在这里。它基本上循环等于我插入到地图内的向量中的元素数量。 RandomAttributes 将一些特征分配给不同类的另一个对象。我认为这与删除指针没有任何关系。我已经检查过了,没有析构函数在任何地方删除数据。
  • 我们真正需要知道的是您如何声明初始化R。它是一个数组吗?你是动态分配的吗?
  • MyRect R[NUM_SHAPES]; // NUM_SHAPES 有点像我之前所说的形状计数器。

标签: c++ vector map


【解决方案1】:

您的代码至少存在一个,也许是两个(或更多)问题。

第一个问题是R是一个数组,数组是编译器在编译的时候静态分配的。你不应该delete它。只有deletenewdelete[]new[]。如果您使用 std::arraystd::vector 并且可以使用简单的赋值,那么为什么要从旧的 C 样式数组开始,并且数组(或向量)将被复制。

还有另一个可能的问题,如果您的数组是在函数中本地定义的,然后您在另一个函数中使用指向它的指针。这是因为局部变量对于定义它的函数(或函数内部的块)是 local 的。一旦代码离开块,局部变量就会在其中被定义,如果你有一个指向它的指针指针变得杂散并指向不再存在的数据,当您使用它时会导致undefined behavior

【讨论】:

  • 我不认为功能范围是问题,因为两者都是主要的。也许与我删除的方式有关。关于删除...如果我们只删除 arr,它会删除特定元素,但是如果我删除 [],它将删除整个内容。那么仅使用删除不正确吗?我也试过这个 delete[] mapIter->second.back();
  • @rSU 再次阅读我回答的第二段,尤其是该段的前两句。
  • 哦,我的错。但我仍然不使用从另一个函数指向它的指针。一切都在进行中。
  • @rSU 只要所有内容都在main 中并且R 不在子块中(在if/while/for/etc 中),那没关系,并且该问题与您要询问的问题无关。你只是不能释放你没有分配的东西。
猜你喜欢
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2015-09-22
  • 2013-11-10
  • 1970-01-01
相关资源
最近更新 更多