2012-07-12 30 views
1

假設我有以下代碼內存管理與標準::向量和boost ::線程

class simple_class 
{ 
public: 
    simple_class() { } 

    void start() 
    { 
     boost::thread simple_thread(&simple_class::expand,this); 
    } 

    void expand() 
    { 
     while(1) 
     { 
      this->private_vector.push_back((int)1); 
     } 
    } 
private: 
    std::vector<int> private_vector; 
}; 

int main() 
{ 
    simple_class* obj1 = new simple_class(); 
    simple_class* obj2 = new simple_class(); 
    obj1->start(); 
    obj2->start(); 
    while(1) {} 
} 

顯然,這一計劃將在某個時候出現內存不足的,應該拋出一個std::bad_alloc。但我的問題是以下幾點:

  1. obj1的private_vector是否會被obj2的private_vector覆蓋之前發生?有沒有辦法被保護呢?
  2. 如果我強制類中的private_vector要在內存中對齊(如Eigen與它的矩陣一樣),當我們定義EIGEN_MAKE_ALIGNED_NEW_OPERATOR時,這會改變問題1嗎?
+0

不,我不這麼認爲。 :) – Chad 2012-07-12 20:43:07

+0

如果不是將元素推送到private_vector,我會不斷調整特徵矩陣的大小並使其更大?或者如果我在展開內部聲明新的特徵矩陣?我知道它不應該,但我問有沒有可能發生的可能性或防止它的方法? – user1194167 2012-07-12 20:45:19

+0

我不知道Eigen分配器是如何工作的,但是如果他們允許在無關的內存上跺腳(因爲'vector's是兩個不同的對象),那將是非常糟糕的。 – Chad 2012-07-12 20:46:18

回答

0

我不是一般人來回答問題,但我幾乎可以100%肯定的回答是:

  1. 「否」。您正在使用新的運算符和一個STL對象。正如你所指出的,你必須擔心的最重要的事情是快速耗盡內存。

  2. 沒有了。我對Eigen矩陣一無所知,但內存對齊將由操作系統和編譯器決定,而不是由語言決定。