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は無効です。条件は真になります。

于 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 に答える