おそらくこれは必要ないが、できるという他の回答に同意します。以下のサンプル コードを参照してください。事前にメモリを割り当てて、placement new に渡します。次のようなことを行う可能性のある配列 new[] フォームを使用している場合は、これを実行することをお勧めします。
void *rawMemory = operator new[](25*sizeof(std::stack));
スタックの配列がある場合は、リソースなどを管理するファクトリ メソッドがありました。いずれにしても、アプリケーションとユースケースによって異なります。以下に簡単な例を示します
#include <iostream>
#include <stack>
int main ( int argc, char *argv[])
{
void *rawMemory = operator new(sizeof(std::stack<unsigned int>));
std::stack<unsigned int> *s = new (rawMemory) std::stack<unsigned int>;
s->push(10);
std::cout << s->top() << std::endl;
return 0;
}
配列バージョンを使用した 2 番目の例。25 の異なるスタックを管理し、それらをクライアントに渡す可能性がある場合に便利です。また、コメントへの返信。今回はコンテナがスタック定義で定義されていることを確認してください。この場合、コンテナにベクトルを使用しています。スタックはコンテナーですが、デフォルトで deque になるコンテナーが基礎にあります
#include <iostream>
#include <stack>
#include <vector>
int main ( int argc, char *argv[])
{
typedef std::stack<unsigned int,std::vector<unsigned int> > StackType;
void *rawMemory = operator new[](25*sizeof(StackType));
StackType *stacks = static_cast<StackType*> (rawMemory);
// allocate
for ( unsigned int i = 0; i < 25; ++i )
{
new (stacks+i) StackType;
}
stacks[1].push(10);
std::cout << stacks[1].top() << std::endl;
// don't forget to delete or smart resize
for ( int i = 24; i >= 0; --i )
{
StackType x;
std::swap ( x, stacks[i] );
}
return 0;
}