В каких случаях я использую malloc против new?

Здесь я пишу программу, которая возвращает несколько значений (более двух значений) в c ++. Эта программа является исполняемой в c ++ 14 (G ++ 4.9.2). Программа похожа на калькулятор.

#  include <tuple>
# include <iostream>

using namespace std; 

tuple < int,int,int,int,int >   cal(int n1, int n2)
{
    return  make_tuple(n1/n2,n1%n2,n1+n2,n1-n2,n1*n2);
}

int main()
{
    int qut,rer,add,sub,mul,a,b;
    cin>>a>>b;
    tie(qut,rer,add,sub,mul)=cal(a,b);
    cout << "quotient= "<<qut<<endl;
    cout << "remainder= "<<rer<<endl;
    cout << "addition= "<<add<<endl;
    cout << "subtraction= "<<sub<<endl;
    cout << "multiplication= "<<mul<<endl;
    return 0;
}

Итак, вы можете четко понимать, что таким образом вы можете вернуть несколько значений из функции. используя std :: pair, могут возвращаться только 2 значения, а std :: tuple может возвращать более двух значений.

435
задан Unihedron 10 August 2014 в 14:11
поделиться

6 ответов

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

Используя new/delete поможет улучшить Ваш код, поскольку Вы не должны будете бросать выделенную память к необходимой структуре данных.

0
ответ дан hackjutsu 10 August 2014 в 14:11
поделиться

Если Вы не вынуждены использовать C, Вы должны никогда использование malloc. Всегда используйте new.

, Если Вам нужен большой блок данных просто, делают что-то как:

char *pBuffer = new char[1024];

Быть осторожным, хотя это не корректно:

//This is incorrect - may delete only one element, may corrupt the heap, or worse...
delete pBuffer;

Вместо этого необходимо сделать это при удалении массива данных:

//This deletes all items in the array
delete[] pBuffer;

new ключевое слово является C++ способ сделать его, и это гарантирует, что Ваш тип будет иметь , конструктор звонил . new ключевое слово - также больше безопасный с точки зрения типов , тогда как malloc не безопасно с точки зрения типов вообще.

единственный способ, которым я мог думать, что это будет выгодно для использования malloc, состоял бы в том, если бы Вы должны были к [1 128] изменить размер своего буфера из данных. new ключевое слово не имеет аналогичного пути как [1 111]. Эти realloc функция могла бы быть в состоянии расширить размер блока памяти для Вас более эффективно.

стоит упомянуть, что Вы не можете смешаться new / free и malloc / delete.

Примечание: Некоторые ответы в этом вопросе недопустимы.

int* p_scalar = new int(5);  // Does not create 5 elements, but initializes to 5
int* p_array  = new int[5];  // Creates 5 elements
345
ответ дан cmaher 10 August 2014 в 14:11
поделиться

Если у Вас есть код C, Вы хотите портировать на C++, Вы могли бы оставить любой malloc () вызовами в нем. Для любого нового кода C++ я рекомендовал бы использовать новый вместо этого.

2
ответ дан Fred Larson 10 August 2014 в 14:11
поделиться

Всегда используйте новый в C++. При необходимости в блоке невведенной памяти можно использовать оператор, новый непосредственно:

void *p = operator new(size);
   ...
operator delete(p);
48
ответ дан Ferruccio 10 August 2014 в 14:11
поделиться

От C++ FQA, Облегченный :

[16.4], Почему я должен использовать новый вместо защищенного старого malloc ()?

FAQ: новый/удаленный вызов конструктор/деструктор; новый безопасно с точки зрения типов, malloc не; новый может быть переопределен классом.

FQA: достоинства новых, упомянутых FAQ, не являются достоинствами, потому что конструкторы, деструкторы и перегрузка оператора являются мусором (см. то, что происходит, когда у Вас нет сборки "мусора"?), и проблема безопасности типов является действительно крошечным здесь (обычно, необходимо бросить пустоту* возвращенный malloc к правильному типу указателя для присвоения ее введенной переменной указателя, которая может быть раздражающей, но совсем не "небезопасной").

, О, и использование защищенного старого malloc позволяет использовать одинаково защищенный & старое перевыделение. Слишком плохо у нас нет новейшего оператора, возобновляют или что-то.

однако, новый не достаточно плохо для выравнивания по ширине отклонения от общего стиля, используемого всюду по языку, даже когда язык является C++. В частности, классы с нетривиальными конструкторами будут неправильно себя вести фатальными способами если Вы просто malloc объекты. Итак, почему бы не использовать новый всюду по коду? Люди редко перегружают новый оператор, таким образом, он, вероятно, не войдет Ваш слишком очень. И если они действительно перегружаются новый, можно всегда просить, чтобы они остановились.

Извините, я просто не мог сопротивляться.:)

50
ответ дан Matthias Benkard 10 August 2014 в 14:11
поделиться

Используйте malloc и free [только 115] для выделения памяти, которая будет управляемой c-centric библиотеками и API. Используйте new и delete [] варианты) для всего, чем Вы управляете.

30
ответ дан dmckee 10 August 2014 в 14:11
поделиться
Другие вопросы по тегам:

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