【发布时间】:2014-03-04 17:22:44
【问题描述】:
(C++) 我在堆上分配了内存对齐的实例,然后在另一个线程中删除它们。代码如下所示:
ALIGNED class Obj
{
public: ALIGNED_NEW_DELETE
...
};
Thread 1:
Obj *o = new Obj; // overloaded new for aligned memory allocation
postTask(o);
Thread 2:
o->runTask();
delete o; // overloaded delete for aligned memory deletion
// "delete" statement crashes
线程 2 中的删除语句将在 Visual Studio 2013 (_BLOCK_TYPE_IS_VALID) 中给出断言错误。 奇怪的是,如果我在创建线程中删除对象,一切运行正常。
为什么会这样?解决办法是什么?
编辑:
@galop1n:实际上我目前使用的是 Eigen 的内置新/删除运算符 EIGEN_MAKE_ALIGNED_OPERATOR_NEW。我也尝试了自己的运算符,都失败了。
对于 Eigen 的运算符,请自行查找其来源。
对于我的分配器:
void* operator new(size_t size){ return alignedMalloc(size, align); }
void operator delete(void* ptr) { alignedFree(ptr); }
void* operator new[](size_t size) { return alignedMalloc(size, align); }
void operator delete[](void* ptr) { alignedFree(ptr); }
void* alignedMalloc(size_t size, size_t align)
{
char* base = (char*)malloc(size + align + sizeof(int));
if (base == nullptr)
ASSERT(0, "memory allocation failed");
char* unaligned = base + sizeof(int);
char* aligned = unaligned + align - ((size_t)unaligned & (align - 1));
((int*)aligned)[-1] = (int)((size_t)aligned - (size_t)base);
return aligned;
}
void alignedFree(const void* ptr) {
int ofs = ((int*)ptr)[-1];
free((char*)ptr - ofs);
}
而 ALIGNED 宏是 __declspec(align(16))。无论有没有“对齐”属性,它都会崩溃。
【问题讨论】:
-
在调用
delete之前,您是否真的在等待构造o? -
@mfukar:是的,一切都完美同步。实际上,如果我创建非对齐实例,删除语句运行良好。
-
@Defd 然后它必须处理你的自定义分配器。
-
您是否正在链接您的 tuntime 库的多线程版本?
-
什么是 ALIGNED 和 ALIGNED_NEW_DELETE?这些不是 C++ 关键字。如果您将它们#define 定义为其他内容,请提示我们...
标签: c++ multithreading memory simd eigen