_BLOCK_TYPE_IS_VALID(pHead->nBlockUse error Visual Studio 2012

_BLOCK_TYPE_IS_VALID(pHead->nBlockUse error Visual Studio 2012

本文关键字:nBlockUse error Visual 2012 Studio gt TYPE BLOCK IS VALID pHead-      更新时间:2023-10-16

当我尝试删除指针内存时,我收到_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();
                 }
            }

你的代码至少有一个,也许两个(或更多)问题。

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

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

相关文章: