akalend
@akalend
программирую

С++ какой вид памяти использовать лучше и главное почему?

1) Какой вид памяти использовать предпочтительней?
  1. char area1[256];
  2. char * area2 = (char*)malloc( 251);



2) и тоже самое к классам:

можно использовать статический класс а, можно динамический:

что лучше?
  1. MyClass m;
  2. MyClass * m2 = new MyClass(); 



3) А если мы используем эту память в классе?
  1. class MyClass() {
  2.    private:
  3.    char area1[256];
  4.    char * area2; 
  5.  
  6.  
  7.     public:
  8.     MyClass() {
  9.         area2 = (char*)malloc( 251);
  10.      }
  11.     ~MyClass() {
  12.         free(area2);
  13.      }
  14. };


что лучше использовать area1 или area2?


Большая просьба привести обоснование

чем плох malloc/realloc?

как лучше использовать в коде.
  • Вопрос задан
  • 4030 просмотров
Пригласить эксперта
Ответы на вопрос 5
Adam_Ether
@Adam_Ether
Java Developer
> Какой вид памяти использовать предпочтительней?
В зависимости от задачи.
1 Если размер массива неизвестен во время компиляции, тогда нужно использовать выделение памяти из «кучи». Если это С++, тогда почему же не делать это через new / delete?
2 Иначе, если размер массива известен, тогда да можно объявить константу и использовать ее для определения размерности.
В жизни чаще встречается 1 вариант
Ответ написан
ixSci
@ixSci
Если пишите на С++ то забудьте о массивах. Всегда используйте указатели, там где не нужны массивы и std::vector\std::array там где они нужны. Массивы это пережиток С и не С++-way
Использовать malloc\free в коде на С++ тоже не лучший выбор.
Ответ написан
hybridcattt
@hybridcattt
Отличие в применимости. Статически вы заранее определяете количество элементов. То есть в си Вы не можете написать char string[n]. Если заранее неизвестно кол-во выделяемой памяти, то ее приходится выделять динамически. С экземплярами классов то же самое.
Отличие при использовании в классе — ну Вы сами написали — в таком случае ее надо выделять в конструкторе и освобождать в дестректоре. Подводный камень — тогда надо писать свой конструктор копирования. Ибо дефолтный копирует все в лоб, в результате Вы получите 2 объекта, у которых Ваше поле ссылается на одну и ту же память. При уничтожении этих объектов получите ошибку (нельзя освободить одну область памяти дважды).
По поводу malloc/realloc — если старые данные уже не нужны, то лучше использовать realloc, а не free+malloc, так как память быстро фрагментируется и в скором времени приложение не сможет выделить нужный объем (malloc выделяет непрерывный блок памяти)
Ответ написан
kostik450
@kostik450
1) Различие в том, что в в первом случае (с массивом) — память выделяется в стеке при начале работы функции и соответственно освобождается при завершении функции автоматически.

А если пользоваться malloc то эта память берется из кучи (heap). И, соответственно можно эту память без проблем передать вызывающей функции при выходе из нашей функции. Но вызывающая функция должна не забыть сделать free.

2) С классами тоже так же что и 1). Срок жизни экземпляра класса во втором случае (new) может быть больше, но зато на нас лежит ответственность — нужно не забывать вызывать delete (это аналог free, только с вызовом деструктора класса).

3) Ну а здесь по большому счету — все равно как действовать, это же наш класс (все переменные private) что захотим — то и воротим внутри, никто все равно не узнает.

Но есть такая тонкость, если мы создаем мультипоточное приложение (multithread) то нужно пользоваться мультипоточной функцией malloc (линковать с мультипоточной либой LIBCMT.LIB вместо устаревшей LIBC.LIB, для VisualStudio это флаг /MT) — иначе будут проблемы.
Ответ написан
@rPman
самое важное отличие — когда вы пользуетесь malloc, то приходится делать приведение типа, в этот момент всю ответственность за корректность приведения берет программист, а значит потенциальное место для ошибок (причем си именно за это и ругают, так как ошибки получаются самые страшные), а если совсем избавиться от указателей (можно оставить ссылочные типы MyClass& a) то тогда за целостностью системы будет следить компилятор и писать 'не туда' вы не сможете.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы