2

C++ オブジェクトのメモリは、コンパイル時に (スタック上で) 割り当てることができます。

MyClass mc;

または動的に (一般的なアプローチ)

MyClass *mc = new MyClass();

オブジェクトが静的または動的な方法で割り当てられたかどうかを区別できる C++ 言語に組み込まれたメソッドはありますか? 組み込みとは、テンプレートやキーワードなどを使用することを意味します (プログラムされていない/アルゴリズムのアプローチ)。

new基本的に、目標は、オペレーターで割り当てられなかったオブジェクトを「マーク」することです(動的割り当て)。

4

2 に答える 2

6

いいえ、オブジェクトが静的に割り当てられたか動的に割り当てられたかを検出することはできません。少なくとも、ほとんどの人がスタックとヒープという言葉を使用するという意味では。C++ 標準では、静的ストレージ (グローバル変数、クラスの静的メンバー、静的ローカル変数)、動的に割り当てられたストレージ、および自動ストレージの 3 種類のストレージが考慮されています。

自動ストレージを持つオブジェクトは、3 つのアリーナのいずれかに割り当てられる可能性のあるより大きなオブジェクトの一部として割り当てられる可能性があるため、事態を複雑にするのは 3 番目のものです。たとえば、ヒープに割り当てられ、 によって管理されるオブジェクトを考えてみましょう。このオブジェクトは、 によってshared_ptr直接割り当てられたかnew、 によって作成された可能性がありますmake_shared。最初のケースでは、あなたのタイプでの呼び出しがnewありますが、後者では、より大きなブロックが動的に割り当てられ、オブジェクトがその場で構築されます:

std::shared_ptr<T> p = std::make_shared<T>();
std::shared_ptr<T> q( new T() );

興味深い点は、オブジェクトがどのように作成されたかを気にする理由です。実際の問題を解決するために、求めているものとは関係のないさまざまなことができる可能性があるためです。

于 2013-04-10T01:42:22.773 に答える
1

StoryTeller が言うように、おそらく必要なのは、newオペレーターをオーバーロードすることです。

class A{
    private:
        bool isDynamic;

    public:
        void *operator new(size_t size){
            isDynamic = true;
        }
于 2013-04-10T01:22:21.733 に答える