1

次のコードがあるとします

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. EIGEN_MAKE_ALIGNED_NEW_OPERATOR を定義するときに、クラス内の private_vector をメモリ内で整列するように強制すると (Eigen がその行列で行うように)、これは質問 1 のように変更されますか?
4

1 に答える 1

0

私は通常、質問に答える人ではありませんが、これに対する答えはほぼ 100% 確信しています。

  1. "いいえ。" new 演算子と STL オブジェクトを使用しています。あなたが指摘したように、あなたが心配しなければならない最大のことは、すぐにメモリが不足することです。

  2. いいえ。固有行列については何も知りませんが、メモリ アラインメントは言語ではなく、OS とコンパイラによって決定されます。

于 2012-07-13T00:25:49.417 に答える