2

変数は常にスタック上ではなくヒープ上にある必要があるという珍しい要件があります。今私は、単純にポインタを取り、それに対して削除を呼び出すクラスのプライベートデストラクタと静的メソッドを使用してこれを試みました。

Class A
{
public :
static void method(const A* ptr)
{
delete ptr;
}
private :
~A();
};

しかし今、私はより良い代替案を知りたいと思っています.1つのことは、変数がスタック上にあるかヒープ上にあるかを確認するために各メソッドに事前チェックを追加できれば、静的メソッドを宣言する必要がないということです。誰でもその方法を教えてもらえますか? sbrk(0) または pthread API を使用して現在のスタックの境界を取得し、それをクラス変数のアドレスと比較しますが、移植性はありません。

ありがとうニラジ・ラティ

4

1 に答える 1

2

実際、あなたのソリューションは機能しません。

using Buffer = std::aligned_storage<sizeof(A), alignof(A)>::type;

int main() {
    // Allocate scratch area to build a 'A'
    Buffer buffer;

    // Build a 'A' using placement new
    new (&buffer) A();

    // Ensure proper deletion at end of scope using `unique_ptr`
    // and a custom deleter (and cast to `A*` as we go).
    std::unique_ptr<A, A::method> a(reinterpret_cast<A*>(&buffer));

    a->method(0);
    // ...
}

したがって、恣意的な破壊を防ぐことに加えて、恣意的な構築(コピー構築とムーブ構築を含む)も防ぐ必要があります。割り当ては既存のオブジェクトに割り当てられるため、パブリックのままにしておくことができます。構築を制御することで、既存のすべてのオブジェクトを希望する場所に確実に配置できます。

于 2013-09-19T08:05:17.463 に答える