Выделение памяти.
От: Simple Boy  
Дата: 07.10.02 09:47
Оценка:
Привет всем !

Чем отличается выделение памяти
по оператору new от malloc ?
Можно ли перевыделять память полученную по new
функцией realloc ?
Re: Выделение памяти.
От: Anton V. Kolotaev  
Дата: 07.10.02 09:50
Оценка:
Здравствуйте Simple Boy, Вы писали:


SB>Чем отличается выделение памяти

SB>по оператору new от malloc ?

malloc — механизм выделения памяти, принятый в С
new — в С++.

new — приводит к вызову конструктора, malloc — нет.

SB>Можно ли перевыделять память полученную по new

SB>функцией realloc ?

Попробуй
Это — грубейшая ошибка.
Re: Выделение памяти.
От: Bell Россия  
Дата: 07.10.02 10:00
Оценка:
Здравствуйте Simple Boy, Вы писали:

SB>Привет всем !


SB>Чем отличается выделение памяти

SB>по оператору new от malloc ?
malloc просто выделяет кусок памяти, new кроме этого еще гарантированно вызывает конструктор, который конструирует объект в этой "сырой" памяти (free и delete отличаются тем же — delete гарантированно вызывает деструктор, и только потом освобождает память)
SB>Можно ли перевыделять память полученную по new
SB>функцией realloc ?
ни в коем случае.
Любите книгу — источник знаний (с) М.Горький
Re: Выделение памяти.
От: Кодт Россия  
Дата: 07.10.02 10:03
Оценка:
Здравствуйте 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)
Перекуём баги на фичи!
Re[2]: Выделение памяти.
От: Simple Boy  
Дата: 07.10.02 11:54
Оценка:
Здравствуйте 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;


Так ?
Re[3]: Выделение памяти.
От: Bell Россия  
Дата: 07.10.02 12:07
Оценка:
Здравствуйте 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;
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.