2013-08-18 57 views
0

好吧,如果我想創建一個自定義的新的運營商一個堆對象,我知道我需要重載new操作是這樣的:是否可以使用自定義分配運算符來創建STACK對象?

void* operator new(size_t size, int unused) 
{ 
    void* ptr = malloc(size); 
    //some custom code 
    return ptr; 
} 

然後,如果我想用創建一個堆對象這個重載的操作員我會這樣做:

SomeClass* a = new(0) SomeClass; 

問題是:我可以這樣做來創建一個堆棧對象嗎?

+3

我絕對不推薦它(除此之外,普通堆棧變量和動態分配棧之間的區別是什麼?您仍然不能將指針放入集合或返回它),但是您的系統*可能*有['alloca'](http://linux.die.net/man/3/alloca)功能​​。 –

+2

哦,並且有關'alloca'函數的警告,您不能在您的運算符中實際使用它,因爲它必須用於應該從其分配堆棧的函數中。 –

+0

@JoachimPileborg問題是,我正在寫一個簡單的內存管理器,它應該通過重寫新的操作符來記錄每個分配的對象。被覆蓋的new運算符應該添加到映射<>有關分配的塊的一些信息,但是,創建一個要插入映射<>的對<實際上調用同一個new運算符,然後一次又一次,直到堆棧溢出。雖然在堆中分配另一個對象似乎是不可能的。如果你知道我在說什麼,我想爲這個地圖創建一個pair <>,而不使用overriden new操作符。 – Aikei

回答

2

我同意其他答案,你可能不需要這個,但你可以做到這一點。請參閱下面的示例代碼,提前分配內存並將其傳遞到新的位置。你可能想要這樣做,如果你正在使用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; 
} 
+1

那麼,是不是std :: stack只是一個容器?它實際上與分配堆棧對象的堆棧有什麼關係? – Aikei

+0

看到我上面的評論。 Stack是一個容器,但它有一個默認爲deque的底層容器 – bjackfly

1

你可以這樣定義一個宏:

#define STACK_NEW(T) new (alloca(sizeof(T))) T 

使用放置新alloca()對分配塊堆疊並在其上構建一個類型爲T的對象。您也可以定義數組版本:

#define STACK_NEW_ARRAY(T, n) new (alloca(n * sizeof(T))) T 

你會使用這個宏在以下幾個方面:

int * p = STACK_NEW(int); 
MyObj * q = STACK_NEW(MyObj) (my, constructor, parameters); 
int * r = STACK_NEW_ARRAY(int, 42); 

你必須手動自毀這些對象:

q->~MyObj(); 

刪除他們將有未定義的行爲。

警告:這整個設施是非常不安全的。我強烈建議不要在您的代碼庫中安裝這樣的系統性危險工具。據我所知,有沒有安全的方式來使用它,它會導致你痛苦!

相關問題