我正在使用带有默认优化设置 (/O2) 的 VS2012,并且此问题仅在发布模式下存在。
我有一些代码使用michael_deque
(使用标准 GC)和指向(抽象)类型的指针T
。
当我尝试将一个指向派生自 的类型的指针推回时T
,应用程序在退出 的push_back()
函数时崩溃michael_deque
。
问题似乎完全取决于这个特定的类型T
,因为编写一个虚拟类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 中做了一些未定义的事情,这会导致优化问题出现问题?