Здравствуйте Simple Boy, Вы писали:
SB>Чем отличается выделение памяти
SB>по оператору new от malloc ?
malloc — механизм выделения памяти, принятый в С
new — в С++.
new — приводит к вызову конструктора, malloc — нет.
SB>Можно ли перевыделять память полученную по new
SB>функцией realloc ?
Попробуй
Это — грубейшая ошибка.
Здравствуйте Simple Boy, Вы писали:
SB>Чем отличается выделение памяти
SB>по оператору new от malloc ?
SB>Можно ли перевыделять память полученную по new
SB>функцией realloc ?
Оператор new может быть перекрыт (хотя,
как правило, в release-версии он вызывает malloc).
Поэтому, если ты уверен на 110% в том, что
inline void* operator ::new(size_t size)
{
return malloc(size);
}
— то можно (если у типа данных нет конструкторов).
То есть,
struct A { int ax; int ay; }; // ok
struct B { A a; char* bz; }; // ok
struct C { std::string s; }; // !!! у одного из членов (у строки) есть нетривиальный конструктор
Итого.
Лучше так не делать.
А если вообще такой вопрос встал, то имеет смысл пользоваться контейнерами (например, std::vector, std::deque, std::list)
Здравствуйте Anton V. Kolotaev, Вы писали:
AVK>Здравствуйте Simple Boy, Вы писали:
AVK>malloc — механизм выделения памяти, принятый в С
AVK>new — в С++.
AVK>new — приводит к вызову конструктора, malloc — нет.
SB>>Можно ли перевыделять память полученную по new
SB>>функцией realloc ?
AVK>Попробуй
AVK>Это — грубейшая ошибка.
Попробовал. Работает. По крайней мере на таком примере:
BYTE *p=new BYTE[2];
p[0]=1;
p[1]=2;
realloc(p,3);
p[2]=3;
delete p;
Но я понимаю что это не есть хороший стиль. Но в таком случае как
перевыделять память полученную от new ?
BYTE *p=new BYTE[2];
p[0]=1;
p[1]=2;
BYTE *temp=new BYTE[2];
memcpy(temp,p,2);
delete p;
p=new BYTE[3];
memcpy(p,temp,2);
p[2]=3;
Так ?
Здравствуйте Simple Boy, Вы писали:
SB>Попробовал. Работает. По крайней мере на таком примере:
Попробуй вместо BYTE использовать некий класс, и посмотри как вызываются (или не вызвыаются) конструкторы/деструкторы
SB>Но я понимаю что это не есть хороший стиль. Но в таком случае как
SB>перевыделять память полученную от new ?
SB>BYTE *p=new BYTE[2];
SB>p[0]=1;
SB>p[1]=2;
SB>BYTE *temp=new BYTE[2];
SB>memcpy(temp,p,2);
SB>delete p;
SB>p=new BYTE[3];
SB>memcpy(p,temp,2);
SB>p[2]=3;
SB>
SB>Так ?
Проще надо быть:
BYTE *p=new BYTE[2];
p[0]=1;
p[1]=2;
BYTE *temp=new BYTE[3];
memcpy(temp, p, 2);//memcpy можно использовать ограниченно - для втроенных типов или классов, которые не содержат мемберов-указателей
delete [] p;//Обрати внимание!
p = temp;