2

以下安全吗?

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
4

2 回答 2

2

你在这里不需要__restrict限定符,实际上你不应该使用它们,因为__restrict应该告诉编译器你没有任何别名到同一个内存,但实际上你确实有别名——foo而且data是别名到同一个记忆。

我认为您的代码的语义很好,否则。您的a.foo 仍然有效并且a.foo is invalid条件将为真。

于 2011-10-24T01:34:12.193 回答
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;
}
于 2011-10-24T02:09:13.443 回答