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;
}

出力は次のとおりです。100100100

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

私が提起したこの質問では、整数を文字列に変換するための効率的な関数が12個あります。これらの関数はすべて、std::stringバッファオーバーフローを心配する必要がないように、割り当てて返します。そして、そこにあるいくつかのオプションは、猛烈な速さです。

于 2012-01-10T04:29:29.690 に答える
1

あなたが説明しているのは、メモリリークではなく、バッファオーバーフローです。

基本的に、あなたは幸運になっています。1文字だけを割り当ててから、それに4文字を書き込むと、割り当てられている文字がオーバーランします。これはバグです。

于 2012-01-10T03:54:38.103 に答える
0

cout << b << endl;:不正解です。バッファオーバーフローです。1文字を含むために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 に答える