我同意其他答案,你可能不需要這個,但你可以做到這一點。請參閱下面的示例代碼,提前分配內存並將其傳遞到新的位置。你可能想要這樣做,如果你正在使用array new []形式,你可能會做類似於
void * rawMemory = operator new [](25 * sizeof(std :: stack));
如果你有一堆棧,你有一個工廠方法來管理資源什麼的。無論哪種方式取決於您的應用程序和用例。下面顯示了一個簡單的例子,使用數組版本,這似乎更實用,你也可以管理25個不同的堆棧和他們遞給客戶
#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;
}
第二個例子。另外,回答你的評論。看看容器是在這個時候在堆棧定義中定義的,在這種情況下,我正在使用容器的向量。堆棧是一個容器,但它有一個基本的容器,默認爲雙端隊列
#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;
}
我絕對不推薦它(除此之外,普通堆棧變量和動態分配棧之間的區別是什麼?您仍然不能將指針放入集合或返回它),但是您的系統*可能*有['alloca'](http://linux.die.net/man/3/alloca)功能。 –
哦,並且有關'alloca'函數的警告,您不能在您的運算符中實際使用它,因爲它必須用於應該從其分配堆棧的函數中。 –
@JoachimPileborg問題是,我正在寫一個簡單的內存管理器,它應該通過重寫新的操作符來記錄每個分配的對象。被覆蓋的new運算符應該添加到映射<>有關分配的塊的一些信息,但是,創建一個要插入映射<>的對<實際上調用同一個new運算符,然後一次又一次,直到堆棧溢出。雖然在堆中分配另一個對象似乎是不可能的。如果你知道我在說什麼,我想爲這個地圖創建一個pair <>,而不使用overriden new操作符。 – Aikei