kre*_*tar 4 c++ destructor stdmap visual-c++ delete-operator
我有一个指向我想要删除的地图的指针(这个地图分配了新的).
这张地图是有效的,我认为,当我在它悬停在调试时,它显示pMap:[0]()..
当我尝试删除这个空白地图时,我的应用程序就退出了,我得到了一个
myapp.exe中0xsomelocation处的第一次机会异常:0xsomenumber:调用的对象已与其客户端断开连接.
在输出窗口中.这是什么意思?
谢谢..
编辑:这是一些示例代码:
typedef map<const char*, StructA*, StructB> myMap;
typedef vector<myMap *> myMapStack;
Run Code Online (Sandbox Code Playgroud)
StructB有一个重载的运算符()
Edit: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);
Run Code Online (Sandbox Code Playgroud)
后来在这个类的析构函数中,我走了
pMyMap = pMyMapStack.back();
pMyMapStack.pop_back();
delete pMyMap; // after I step over this line the app quits.. and displays that message
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑:我恢复到旧版本的代码工作,它现在工作正常..
有效的是这样的:
// after the pMyMapStack.pop_back()
int x = pMyMap->size();
if (x >= 0)
delete pMyMap;
Run Code Online (Sandbox Code Playgroud)
早些时候我把它改成了这个:
// after the pMyMapStack.pop_back()
int (x = pMyMap->size();
if (x >= 0){
pMyMap->clear();
delete pMyMap;
}
Run Code Online (Sandbox Code Playgroud)
很奇怪..代码中可能还有其他问题,但我还是无法弄清楚它在哪里......它太大了(我可能会被解雇)如果我把代码全部发布到那么就让我们离开那个..
我认为它可能是一个指向空图的指针,我试图清除或删除导致问题的空图.
感谢所有那些试图帮助的人... :)
好吧,您的示例代码存在很多问题.当您将地图实例化为以下情况时,事情开始变得很糟糕:您<const char*, StructA*, StructB*>
是否有理由在地图中存储指针而不是值?
std::map无论如何都可能存储你在堆上添加的元素.你应该使用std::string而不是const char*.然后绝对没有理由将比较器作为指针传入.
这对你来说也是如此mapStack(如果你需要一个堆栈,你为什么不使用它?).只要您不共享对象或使用纯虚基类,就没有理由使用指针.如果你必须使用指针,尝试不使用原始指针.
在您解决了这些错误后,您应该没有任何理由使用new或delete.
| 归档时间: |
|
| 查看次数: |
1397 次 |
| 最近记录: |