This is awkward, the problem is in Thread 2, The Obj* is casted into a base class' pointer Task*, and for the utter stupidity: ~Task() is not virtual:
class Task
{
public:
~Task(); // <-- not virtual, therefore it crashes
...
}
ALIGNED class Obj : public Task
{ ... }
Should have discovered this problem much much earlier. Because, as in my description of the problem, i said it myself it gives an assertion error: _BLOCK_TYPE_IS_VALID, this is a visual studio debug lib's stuff for the default delete operator, which means it didn't even run into my overloaded delete operator, which ultimately means I missed a "virtual".
It's my bad that i even forgot to add the class inheritance to the question.
Sometimes, i can be stuck at a problem for hours or even days. But after i posted the issue online, i can immediately find the answer. Dunno if any of you have similar problems before; perhaps i've put too much stress onto myself.
Still, thanks you, Internet.