以下是否安全?
struct K { ... }
struct A
{
A(int psize) : size(psize), foo(nullptr), bar(nullptr)
{
auto dataptr = (K*)_aligned_malloc(sizeof(K) * psize * 2, 32);
data = shared_ptr<K>(dataptr, ptr_fun(_aligned_free));
foo = data.get();
bar = data.get() + psize;
}
K* __restrict foo;
K* __restrict bar;
private:
shared_ptr<K> data;
};
请注意foo和bar上的__restrict。
目标是在所有对象别名都已死亡时分配内存自毁。
{
A a(1000);
{
A o = a;
}
//a.foo is still valid
}
//a.foo is invalid
答案 0 :(得分:2)
这里你不需要__restrict
个限定符,实际上你不应该使用它们,因为__restrict
应该告诉编译器你没有任何别名到同一个内存,但事实上你确实有别名 - foo
和data
是同一记忆的别名。
我认为你的代码的语义很好,否则。您的 a.foo仍然有效且 a.foo无效条件为真。
答案 1 :(得分:0)
这不安全,因为malloc不调用构造函数而free不调用析构函数。为了安全起见,您需要手动添加这些调用:
A(int psize) : size(psize), foo(nullptr), bar(nullptr)
{
auto dataptr = (K*)_aligned_malloc(sizeof(K) * psize * 2, 32);
new(dataptr) K();
data = shared_ptr<K>(dataptr, [](K *k){ k->~K(); _aligned_free(k) ));
foo = data.get();
bar = data.get() + psize;
}