デフォルトの最適化設定 (/O2) で VS2012 を使用していますが、この問題はリリース モードでのみ存在します。
michael_deque
(標準 GC を使用した) および (抽象) type へのポインターを使用するコードがいくつかありますT
。
から派生した型へのポインターをプッシュバックしようとすると、 の関数T
を終了するときにアプリケーションがクラッシュします。push_back()
michael_deque
問題はこの特定の type に正確に依存しているようですT
。なぜなら、ダミーの class を作成し、foo
それをクラスで派生させbar
(そしてコンストラクターで何かを出力して最適化されないようにする)、そしてnew bar()
michael_deque にプッシュバックしてもクラッシュしないからです。
問題のクラスT
は次のとおりです。
class Task
{
public:
Task() : started(false), unfinishedTasks(1), taskID(++taskIDCounter) {};
Task(unsigned int parentID_) : started(false), unfinishedTasks(1), taskID(++taskIDCounter), parentID(parentID_)/*, taken(0)*/ {};
virtual ~Task() = 0 {};
virtual void execute() final
{
this->doActualWork();
unfinishedTasks--;
}
virtual void doActualWork() = 0;
public:
unsigned int taskID; //ID of this task
unsigned int parentID; //ID of the parent of this task
bool started;
std::atomic<unsigned int> unfinishedTasks; //Number of child tasks that are still unfinished
std::vector<unsigned int> dependencies; //list of IDs of all tasks that this task depends on
};
エラーは最小限のプログラムで再現できます (私と同じ方法でこれを実行できる環境がある場合はstd::atomic<unsigned int> taskIDCounter
、Task クラスがそれを見ることができる場所に置くだけです):
#include <cds/container/michael_deque.h>
#include "task.hpp"
class a : public Task
{
a()
{
std::cout<<"dummy print"<<std::endl;
}
virtual ~a()
{
}
virtual void doActualWork()
{
std::cout<<"whatever"<<std::endl;
}
};
int main()
{
cds::Initialize();
{
cds::gc::HP hpGC;
cds::gc::HP::thread_gc myThreadGC;
cds::container::MichaelDeque<cds::gc::HP,Task*> tasks;
tasks.push_back(new a()); //will crash at the end of push_back
}
cds::Terminate();
}
これの原因は何ですか?最適化問題で問題を引き起こすクラス Task で未定義のことをしますか?