这个指针不同于调用方法的指针
问题描述:
我在C++中编写了一个应用程序,这个应用程序有时会崩溃,因为存储无效的这个指针的对象方法!当我调试我的应用程序,并看看调用堆栈有功能 func1和以下是 func2。在第一个函数指针是有效的,但在第二个,在这个指针应该有相同的地址作为第一个函数的指针,该指针指向一些无效的内存地址:这个指针不同于调用方法的指针
void obj1::func1(obj2* o){
//Pointer o is valid and correctely initialized when i debug my Application
o->func2();
}
void obj2::func2(){
//Here i do a call on the this pointer. The this pointer is invalid and so my
//Application is crashing. How can i have a different this pointer then the
//pointer i was calling on. I can't imagine how this can happen.
this->someCall();
}
我的应用程序使用不同的线程,所以我有这样的想法,我perhalbs删除我的对象在一些其他线程不工作就像它sould,但这样的指针不会改变 - 请告诉我,如果我错了。我不知道这个错误是如何发生的。
感谢您的帮助。 Denis
答
您提供的代码没有任何问题。但我认为答案在于你的问题:你正在使用多个线程。一旦你有多个线程,你需要检查你的线程模型以及如何访问内存得到同步。不幸的是,由您确定究竟发生了什么,因为这个问题似乎与这个特定代码的写法没有关系。
答
看来这个问题是由于多线程问题。
计算机在执行A行和B行之间需要短暂休息,并最终可能会删除“o”指向的对象。
void obj1::func1(obj2* o){
o->func2(); //Line A
}
void obj2::func2(){
this->someCall(); //Line B
}
您要查找的代码,解构(显式或隐式)对象的所有场所,并确保他们无法删除的对象仍然被指出在同时。
您可以通过使用智能指针或仅通过锁定对象上的操作来强制执行此操作。
可能这是堆栈损坏func1中的某处。 – 2012-08-13 10:07:59
你能向我们展示'obj1'和'obj2'类接口的相关部分吗?为什么你把它称为'this-> someCall()'而不是'someCall()'。 'obj2'是否从其他类派生? – TemplateRex 2012-08-13 10:13:51
请提供编译和显示您遇到问题的最少资源。 – NoSenseEtAl 2012-08-13 10:29:45