いいえ、オブジェクトが静的に割り当てられたか動的に割り当てられたかを検出することはできません。少なくとも、ほとんどの人がスタックとヒープという言葉を使用するという意味では。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() );
興味深い点は、オブジェクトがどのように作成されたかを気にする理由です。実際の問題を解決するために、求めているものとは関係のないさまざまなことができる可能性があるためです。