2011-12-22 20 views
3

特定の状況では、変数(文字配列またはstd:文字列)が必要です。サイズは10 kBを超えてはいけません。配列を特定のサイズ(キロバイト)に制限する方法

どのようにこの変数のサイズを制限できますか? Cでの文字配列が今まで自動的に拡張かのように文字列の場合

+2

、簡単な、きれいでは不可能ですC++で簡単に保守することができます。 unwindのようなstd :: stringのテンプレートをラップしてappendをオーバーライドできますが、それは仮想関数ではないため、派生してオーバーロードできないだけでなく、元の動作を復元するコードを__lot__書く必要があります。あるいは、あなたが失敗する(つまり、 'std :: bad_alloc'をいくつかの制限を超えて)スローするカスタムアロケータを使うことができます。これは動作しますが、おそらくあなたが望む方法ではありません。最後に、多項式が示唆するようにすることができますが、それはC++ではありません。あなたはおそらくちょうど長さを追加する前にチェックしたいと思うでしょう... – Damon

+0

それについて考えると、あなたは実際には仮想ではないにもかかわらず単一の機能を上書きすることができます...しかし、私はまだこのようなことをしたくないです。 – Damon

答えて

4

がジャストサイズ制限を超えるようにサイズを変更しないでください:

char* realloc_lim(char* data, int new_count, bool &ok) 
{ 
    if(sizeof(char) * new_count > SIZE_LIMIT) 
    { 
     ok = false; 
     return null; 
    } else { 
     ok = true; 
     return (char*)realloc((void*)data, sizeof(char) * new_count); 
    } 
} 

あなたはこのようにそれを使用することができます:あなたが欲しい

bool allocation_ok = false; 
int newsize = readint(); // read the size as an int from somewhere 
buffer = realloc_lim(buffer, newsize, &allocation_ok); 
if(!allocation_ok) 
{ 
    printf("Input size was too large!\n"); 
} 
+1

'sizeof(char)'は定義により常に1です。 charが32ビットであっても、 'sizeof(char) 'は1になります(しかしCHAR_BITSは32になります)。 – Sjoerd

+0

@Sjoerd - 'sizeof(char)'を 'wchar_t'、' FILETIME'、または任意の数の異なる型のために簡単に入れ替えることができた理由があります。 – Polynomial

+1

あなたはそのような 'bool&ok'パラメータを使う必要はありません。あなたは 'null'の戻り値をチェックすることができます。 – TonyK

4

は、ちょうど

char ten_k[10240]; 

を行うそうではありませんので、私はこれがあなたのために問題になる可能性がどのように見て苦労しています。

C++では、制限を実装するために標準の文字列型をラップする必要があります。もちろん

LimitedString<10240> ten_k; 

、これは少し後方である;:これは、多くの場合、すなわち、あなたのような何かを持っていると思い、テンプレートクラスとして行われますそのコードはおそらく制限が当たったときに何をすべきかを知っているため、最初に文字列を生成するコードに制限を組み込む方が理にかなっています。

+0

かなりのOPは、固定サイズで宣言するのではなく、サイズを制限したいと考えています。 – Polynomial

+0

+1は、文字列生成コード内に制限を課し、残りのコードでは通常の型(char *またはstd :: string)を使用することを推奨します。 – Sjoerd

3

C++にはそのメカニズムがありません。しかし、あなたはこのような何かをするだろうあなた自身の自立myresize機能を実装できます。もちろんなど、あなたがpush_backappendのための同様の機能を書くことができ

bool myresize(std::string& s, int newSize) 
{ 
    if(newSize > maxSize) 
     return false; 
    s.resize(newSize); 
    return true; 
} 

をこれらの関数を呼び出すためにあなたの責任であるべき文字列のメンバーではなく

関連する問題