Выделение памяти для _M_start и _M_finish в векторе - PullRequest
1 голос
/ 11 февраля 2010

Я определяю вектор как:

vector< int, MyAlloc< int> > *v = new vector< int, MyAllooc< int> > (4);

MyAlloc выделяет место только для 4-х дюймов. Память для _M_start, _M_finish и _M_end_of_storage выделяется в куче перед памятью на 4 дюйма Но кто выделяет эту память для _M_start, _M_finish и _M_end_of_storage? Я хочу выделить эту память сам. Что мне делать?

Ответы [ 4 ]

4 голосов
/ 11 февраля 2010

Не используйте new для выделения вектора. Как правило, вы должны выделить векторы из стека:

vector< int, MyAlloc< int> > v(4);

Если вам действительно нужно использовать свой собственный распределитель для этого, выделите память для объекта и затем вызовите для него новое размещение, чтобы создать вектор.

Также возможно перегрузить глобальный оператор new / delete, но это действительно грязно, и я бы не рекомендовал это.

1 голос
/ 11 февраля 2010

Распределители выделяют хранилище данных контейнера, а не элементы данных контейнера, которые выделяются как обычно. Это должно быть так, иначе вы не сможете создать вектор, используя new или в стеке. Это наиболее очевидно для контейнера на основе узлов, такого как список: узлы списка распределяются распределителем, но остальные члены данных, включая указатели на первый и последний узлы (если реализованы таким образом), распределяются нормально.

0 голосов
/ 11 февраля 2010

Когда вы создаете вектор, он выделяет место для переменных-членов вектора (_M) , куда бы вы ни поместили вектор . Если вы используете new, он выделяет пространство для этих переменных в куче. С локальными переменными компилятор освобождает место для них в текущем кадре стека. Если вы сделаете вектор членом класса, компилятор освободит место для него в содержащем классе.

Затем вектор использует свой распределитель, чтобы выделить место для данных, которые вы хотите сохранить в векторе, используя любой механизм, который определен распределителем.

0 голосов
/ 11 февраля 2010

new T выделяет sizeof(T) памяти в куче. В вашем случае T - это std::vector< int, MyAlloc< int> > и включает такие элементы, как _M_start.

Если вы хотите выделить эту память самостоятельно, не звоните new.

...