(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 DELETE語句將在Visual Studio 2013(_BLOCK_TYPE_IS_VALID)給出一個斷言錯誤。 奇怪的是,如果我刪除創建線程中的對象,一切運行良好。
爲什麼會出現這種情況?什麼是解決方案?
編輯:
@ galop1n:其實我現在使用的是本徵的內置新/ delete操作符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);
}
,並將校準的宏__declspec(對齊(16))。它崩潰時有或沒有「ALIGNED」屬性。
你實際上是否在調用'delete'之前等待'o'構造? –
@mfukar:是的,一切都完美同步。實際上,如果我創建不對齊的實例,刪除語句運行良好。 – Defd
@Defd然後它必須處理您的自定義分配器。 – galop1n