Это способ выделения памяти плохо? - PullRequest
0 голосов
/ 07 октября 2011

Мне было интересно, как malloc выделит память (можете ли вы сказать мне?), Поэтому я попробовал кое-что.

Это плохой способ выделения памяти?

void* myMalloc(unsigned int size) {
    return (void*) new bool[size];
}

Ответы [ 5 ]

6 голосов
/ 07 октября 2011

Стандарт C ++ прямо устанавливает, что функции C malloc и free не должны вызывать operator new или operator delete (20.6.13 / 3 и 4 в F ++ F ++ C ++ 11). Это заставляет меня вспыхнуть красным светом ...

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

Вывод: да, это плохой способ выделения памяти.

4 голосов
/ 07 октября 2011

Есть несколько ошибок:

1) вы предполагаете sizeof(bool) == 1, что не обязательно верно. Изменить

return (void*) new bool[size];

до

return (void*) new char[size];

2) как вы освободите память? Вы должны сделать что-то вроде:

char* x = myMalloc(unsigned int size);
delete[] x; //not free, since you actually use new and not malloc

3) malloc не вызывает new, скорее всего, наоборот (в VS20xx новый вызовет malloc). malloc также не вызывает конструкторы, поэтому, если это работает, оно будет работать только для базовых типов.

3 голосов
/ 07 октября 2011

Я не хочу не соглашаться с вполне , поэтому многие люди рекомендуют использовать new char[n], но я чувствую себя обязанным сделать это.

Поскольку вы хотите выделить «сырую» память,не объекты, вы должны действительно использовать ::operator new вместо new some_type[some_size]:

 void *myMalloc(size_t size) { 
     return ::operator new(size);
 }

В конечном счете, new char[whatever] не особенно вреден, но (по крайней мере, IMO) это концептуально неправильно, и я не вижупреимущество перед использованием ::operator new напрямую.

0 голосов
/ 07 октября 2011

Если вы хотите выделить определенное количество байтов с помощью new[], используйте new char[n]. В отличие от bool, sizeof(char) гарантированно равно 1.

Что касается реализации new и malloc, new - это конструкция более высокого уровня (так как она также вызывает конструкторы для типов, которые их имеют) и, следовательно, вероятно, реализована в терминах malloc, а не наоборот.

0 голосов
/ 07 октября 2011

malloc() / free() не обязательно совместим с new и delete. new вполне может вызвать malloc() (по крайней мере, по умолчанию), но вы не должны на это рассчитывать.

Одно существенное различие между malloc() и new() состоит в том, что malloc() возвращает void*, который указывает на необработанную память, тогда как new возвращает типизированный указатель и вызывает конструктор, если таковой имеется (и delete вызывает деструктор).

Если вы пишете на C ++, очень редко есть веская причина выделять необработанную нетипизированную память.

Но если вы действительно хотите это сделать, вы можете написать что-то вроде:

void *p = (void*)new char[size];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...