2013-02-27 3 views
3

У меня есть код C с операторами malloc в нем, которые я хочу объединить с некоторым кодом на C++.Typecasting malloc C++

Мне было интересно, когда и почему возникает приказ о вызове malloc в C++?

Например:

char *str = (char*)malloc(strlen(argv[1]) * sizeof(char)); 
+0

http://stackoverflow.com/questions/15018011/building-a-mixed-cc-code/15018044#comment21100758_15018044 –

+0

Я уже видел этот вопрос, но он не отвечает, почему это необходимо в C++. – user2052561

ответ

15

, когда и почему типажей вызов таНос в необходимому C++?

Всегда, когда не присваивание void *, поскольку void * не преобразует неявно других типов указателей, так, как это делает в С. Но истинный ответ является вы никогда не должны использовать malloc в C++ в первое место.


Я не предлагаю вам следует использовать new вместо malloc. Современный код на C++ должен использовать экономно new или вообще избегать его, если это возможно. Вы должны скрыть все использование new или использовать непримитивные типы (например, std::vector, упомянутые Xeo). Я не очень квалифицирован, чтобы давать советы в этом направлении из-за моего ограниченного опыта, но this article вместе с поиском «C++ avoid new» должен помочь. Тогда вы будете хотеть посмотреть в:

+0

«Ever» настолько силен. – Inisheer

+4

@ Inisheer Это, но, удалив его, я почувствовал бы себя как будто выдающийся. – cnicutar

+3

@ Inisheer: Это не только сильное, это правильная вещь. – Xeo

-1

malloc всегда возвращает void* так что вам нужно бросить все (потому что C++ имеет сильную проверку типов, чем C и Дон» t это автоматически)

Когда я использую C, я также бросаю все, для ясности кода.

Кроме того, не стесняйтесь использовать malloc() в C++, это есть по уважительной причине.

Преобразование всего кода C на C++, переписывая каждый malloc() к новому очень склонен вводить много ошибок в коде, если у вас нет времени, чтобы держать чтение код, который вы объединяете, чтобы найти каждый экземпляр malloc() , free(), calloc(), и т.п ... на это.

Только не смешивайте malloc() с delete или new с free() или все перерыв.

+1

Мой подход не использует malloc – 111111

+0

«Когда я пользуюсь C, я также бросаю все, для ясности кода. " - На самом деле, [вы бросаете его для двусмысленности] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). Это ** ошибка ** для приведения возвращаемого значения 'malloc()' в C. – 2013-02-27 18:02:35

+4

@speeder Ну, о 'новой' части ... действительно хороший C++ не использует' new' либо – cnicutar

1

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

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

1

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

char* str = new char;

это означает, что вам не нужно делать каких-либо отливку как путь C и вы не Не нужно указывать, насколько большой объем памяти вам нужен. Кроме того, если это был объект, такой как std::string, тогда вы не будете вызывать конструктор при использовании malloc, это просто резервирует память для использования с указателем str, поэтому лучше всегда использовать new с C++, если вы также можете, когда вы восстанавливаете память, всегда используйте подходящий путь, если вы new, то вы delete, и если вы malloc вы free. Если вы используете free в памяти, которая была new 'd, вы не будете называть этот деструктор объектов.

2

Скомпилируйте свою библиотеку C. Скомпилируйте свою библиотеку C++. Заставьте их играть хорошо в любой «основной» программе, которая их использует. Точка в том, что если вы поддерживаете смешанную базу кода, вы, вероятно, захотите изолировать чистый материал C от материала C++. В противном случае ваш материал C превращается в материал C++, который выглядит только как C.