删除std :: map(Visual C ++)

时间:2010-03-01 09:00:20

标签: c++ visual-c++ destructor stdmap delete-operator

我有一个指向我想要删除的地图的指针(这个地图是用新的分配的)。

我认为此地图有效,当我在调试时将鼠标悬停在该地图上时,会显示pMap[0]() ..

当我尝试删除这个空地图时,我的应用程序就退出了,我得到了一个

  

myapp.exe中0xsomelocation处的第一次机会异常:0xsomenumber:调用的对象已与其客户端断开连接。

在输出窗口中。这是什么意思?

谢谢..

编辑:这是一些示例代码:

typedef map<const char*, StructA*, StructB> myMap;
typedef vector<myMap *> myMapStack;

StructB有一个重载的运算符() 编辑:StructB IS确实是一个结构,对不起,operator()只是一个字符串比较函数..

在我的代码的某些部分,类的构造函数调用一个方法,让我们称之为InitClass(),初始化一个myMap指针,如下所示:

pMyMap = new myMap; // I also tried this with new myMap()
// this pointer is then pushed onto the a map stack
pMyMapStack.push_back(pMyMap);

稍后在这个类的析构函数中,我去了

pMyMap = pMyMapStack.back();
pMyMapStack.pop_back();

delete pMyMap; // after I step over this line the app quits.. and displays that message

由于

编辑:我恢复了旧版本的代码,现在工作正常......

有效的是:

// after the pMyMapStack.pop_back()
int x = pMyMap->size();
if (x >= 0)
    delete pMyMap;

早些时候,我已将其更改为:

// after the pMyMapStack.pop_back()
int (x = pMyMap->size();
if (x >= 0){
    pMyMap->clear();
    delete pMyMap;
}

很奇怪..代码中可能还有其他错误,但我还是无法弄清楚它在哪里......它太大了(我可能会被解雇)如果我把代码全部发布到了让我们离开它......

我认为它可能是我试图清除或删除导致问题的空图的指针。

感谢所有试图帮助的人...... :)

6 个答案:

答案 0 :(得分:5)

嗯,您的示例代码存在很多问题。当您将地图实例化为:<const char*, StructA*, StructB*>时,事情开始出错 您是否有理由在地图中存储指针而不是值? 无论如何,std::map可能会存储您在堆上添加的元素。另外,您应该使用std::string代替const char*。然后绝对没有理由将比较器作为指针传递。

同样适用于您的mapStack(如果您需要堆栈,为什么不使用堆栈?)。只要您不共享对象或使用纯虚基类,就没有理由使用指针。如果你必须使用指针,尝试不使用原始指针。

在您解决了这些错误后,您应该没有任何理由使用newdelete

答案 1 :(得分:1)

只是在黑暗中拍摄,因为没有可用的代码。你确定指针是一个地图而不是一个地图数组(在这种情况下你需要使用delete [])?

答案 2 :(得分:1)

你应该在执行pop_back()之前进行删除。

答案 3 :(得分:1)

你正在投掷指针,就像没有明天一样。最可能的解释是,您通过解除分配(但非空)指针来破坏您的地图结构。有关更多建议,请参阅pmr的答案。除非必须,否则不要使用指针。您的代码没有理由处理地图指针而不是地图对象。

答案 4 :(得分:1)

由于您的代码(您发布的)没有任何可能导致此问题的信息,因此我使用Google搜索您的错误字符串并发现它与COM有关。

这篇文章可以帮到你: What may be the causes of the error 0x80010108 (The object invoked has disconnected from its clients)?

与问题无关: 我发现这很有趣:

typedef map<const char*, StructA*, StructB*> myMap;

你的第三个模板参数如何成为struct 指针?我认为它必须是普通的类/类型。

答案 5 :(得分:1)

老实说,我认为如果没有真正的代码发布,我们就不会去。

可能有101个代码出错的地方,不仅限于发布的代码段。

从显示的对象插入和删除实现中,没有语法也没有逻辑错误。 如果源代码非常有价值,可以在这里共享,尝试创建一个虚拟项目,简单到足以证明问题(如果问题在虚拟项目中不存在,你知道你正在解决错误的方向)