0

当我使用 itoa() 时,它需要一个 char* _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

4 回答 4

6

最佳实践:根本不要使用它。

为什么?因为它不在标准中。

我应该怎么做?使用std::to_string.

(如果你真的不得不使用itoa,那么使用一个大的本地静态缓冲区,就像char[512]这样 - 如果你想真的很安全,你可以使数组大小sizeof(unsigned long long int) * CHAR_BIT + 2或类似的东西,这样它就可以始终保存任何表示的数字在任何基础上,加号。)

于 2012-01-10T03:54:13.627 回答
2

我提出的这个问题中,您会发现十几个用于将整数转换为字符串的高效函数,所有这些函数都分配并返回 a std::string,因此您不必担心缓冲区溢出。而且里面的几个选项都快起泡了。

于 2012-01-10T04:29:29.690 回答
1

您所描述的不是内存泄漏,而是缓冲区溢出

基本上,你很幸运。如果您只分配一个字符,然后写入四个字符,您将超出分配给您的内容,这是一个错误。

于 2012-01-10T03:54:38.103 回答
0

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);
于 2012-01-10T03:53:41.423 回答