Если Вы не вынуждены использовать 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
Попробуйте использовать GetTextExtentPoint32 . Это использует текущий шрифт для данного контекста устройства для измерения ширины и высоты отображаемой строки в логических единицах. Для режима отображения по умолчанию, MM_TEXT, логическая единица 1 равна 1 пикселю.
Однако, если вы изменили режим отображения для текущего контекста устройства, логическая единица может не совпадать с пикселем. Вы можете прочитать о различных режимах отображения в MSDN . В режиме отображения вы можете преобразовать размеры, возвращаемые вам GetTextExtentPoint32, в пиксели.
Точно не знаю, но похоже, что:
HDC hDC = GetDC(NULL);
RECT r = { 0, 0, 0, 0 };
char str[] = "Whatever";
DrawText(hDC, str, strlen(str), &r, DT_CALCRECT);
может сработать.
В зависимости от того, как вы это используете, вы можете использовать DrawText с указанным DT_CALCRECT, и он (он всегда делал это довольно точно для меня) вычисляет размер необходимого прямоугольника на основе текста / шрифт / и т. д.
VOID Example_MeasureString (HDC hdc) { Графическая графика (HDC); // Устанавливаем строку. Строка WCHAR [] = L "Текст измерения"; Шрифт шрифта (L «Arial», 16); RectF layoutRect (0, 0, 100, 50); RectF boundRect; // Измеряем строку. graphics.MeasureString (строка, 12, & шрифт, layoutRect, & boundRect); // Рисуем прямоугольник, представляющий размер строки. graphics.DrawRectangle (& Pen (Цвет (255, 0, 0, 0)), boundRect); }