Какова лучшая практика использования itoa ()? - PullRequest
0 голосов
/ 10 января 2012

Когда я использую itoa (), ему нужен символ * _DstBuff, что здесь лучше?

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
  int num = 100;

  // I'm sure here is no memory leak, but it needs to know the length.
  char a[10]; 

  // will this causue memory leak? if yes, how to avoid it?
  // And why can itoa(num, b, 10); be excuted correctly since b
  // has only allocated one char.
  char *b = new char; 

  // What is the difference between char *c and char *b
  // both can be used correctly in the itoa() function
  char *c = new char[10]; 

  itoa(num, a, 10);
  itoa(num, b, 10);
  itoa(num, c, 10);

  cout << a << endl;
  cout << b << endl;
  cout << c << endl;
   return 0;
}

вывод: 100 100 100

Так может ли кто-нибудь объяснить разницу между char *b = new char; и char *c = new char[10]; здесь?

Я знаю, char *c будет динамически выделять 10 символов, но это означает, что char *b будет динамически выделять только 1 символ, если я прав, почему вывод все правильно?

на самом деле, что является лучшей практикой a, b или c?

Ответы [ 4 ]

6 голосов
/ 10 января 2012

Лучшая практика: Не используйте его вообще.

Почему? Потому что это не в стандарте.

Что мне делать вместо этого? Использовать std::to_string.

(Если вы действительно застряли с необходимостью использовать itoa, тогда используйте большой локальный статический буфер, например char[512] или около того -если вы хотите быть действительно действительно безопасным, вы можете сделать размер массива sizeof(unsigned long long int) * CHAR_BIT + 2 или что-то в этом роде, чтобы он всегда мог содержать любое число, выраженное в любой базе плюс знак.)

2 голосов
/ 10 января 2012

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

1 голос
/ 10 января 2012

То, что вы описываете, это не утечка памяти, а переполнение буфера .

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

0 голосов
/ 10 января 2012

cout << b << endl;: неверно, переполнение буфера.потому что вы выделяете 1 байт памяти, чтобы содержать один символ.но вы пишете на нем itoa() 10 + 1 символ.

, поэтому вам нужно выделить: char * d = new char[11]; // 10 chars + '\0'(end of string char).

, затем использовать itoa(num , d , 10);

дополнительно itoa() не является стандартным, поэтому я предпочитаю использовать стандарт sprintf(d,"%d",num);

и, как сказано в комментарии ниже, если вам не нужен char* и вы можете использовать std::string.используйте

string d = std::to_string(num);
...