純粋な仮想関数で基本クラスBを継承したクラスAのオブジェクトに問題があり、私はptrオブジェクトのリストを持っています問題は、リスト内のオブジェクトから仮想メソッドにアクセスしようとすると、__vfptrテーブルが破損することがあることです。オブジェクトはリストにあり、削除されません。誰にもなぜこれが起こっているのかについての考えがありますか?問題は、アプリケーションの1つまたは2つのインスタンスを起動してもエラーは発生しないが、さらに多くのインスタンスを開始すると、アプリケーションの3番目または4番目のインスタンスで奇妙なアクセス違反が発生するということです。削除されていないオブジェクトで__vfptrテーブルが壊れています
少なくとも、vftableへのポインタがいつ変化しているかを追跡する方法はありますか?そのメソッドは複数の場所から呼び出され、おそらくこのエラーがランダムに発生することはもちろん、デバッガですべてを追跡することはできません。
はここにUPDATE 1つの
例
あなたにたくさんありがとう:あなたのコードではhttp://rextester.com/live/MRHR24728
//Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86
#include <iostream>
#include <stdint.h>
typedef struct
{
uint8_t name;
}sName;
class Base1
{
public:
virtual ~Base1(){};
virtual const sName* GetName() = 0;
};
class Base2 : public Base1
{
public:
Base2(){};
virtual ~Base2(){}
virtual const sName* GetName() { return &_name; }
private:
sName _name;
};
class Base3 : public Base2
{
public:
Base3(){}
virtual ~Base3(){}
};
class Object : public Base3
{
public:
Object(){}
~Object(){}
};
int main()
{
Object object;
Base1 *_logicalDevices[1] = {&object};
const sName * test = _logicalDevices[0]->GetName(); // this is where it breaks sometimes when trying to access the GetName method
std::cout<<test->name;
}
、コードや大型クラスの行数千の百がある – stryku
いくつかのコードを投稿してください、私は、全体のことを合成しようとするでしょう@ stryku –
updated @stryku –