0

私は学校のソートアルゴリズムに取り組んでおり、奇妙な問題に遭遇しました. 6 要素を超える整数配列を作成するたびに、「free.c」でブレークが発生し、ヒープ破損エラーが発生します。

私が絞り込んだコードは次のとおりです。

#include <iostream>

using namespace std;

int main(){
    int * pie = new int(7);
    pie[6] = 1;

    cout << pie[6];

    return 0;
}

最後の値以外のものを割り当てる必要がある場合もありますが、複数のコンピューターの Visual Studio 2012 および 2010 でこのエラーが発生することがありますが、Linux ではこのコードは完全に正常に動作します。

これは Windows の問題ですか?動的な int 配列を永遠に間違っていたのでしょうか?

注:これを数回実行した後、VS の出力にヒープ保護シャントの追加に関する何かが表示されることがあります。これにより、例外をスローするテストを解決しているように見えますが、大規模なアプリケーションの問題は解決されません (そして、私のコードにそのような保護を適用する必要があります)。

ありがとう!

4

3 に答える 3

7

この場合、値を持つ単一の整数を割り当てますが、要素7の配列のように扱います。7実際の配列割り当てを行う必要があります

int* pie = new int[7];

また、最後にメモリを解放しても害はありませんmain:)

delete[] pie;
于 2013-03-29T20:55:30.893 に答える
3

new int(7)単一intの , 値 7 を割り当てます。7つのint値にスペースを割り当てません。

于 2013-03-29T20:55:12.857 に答える
1

問題を解決するには、次を使用する必要があります。

int* pie = new int[7];

それ以外の場合は、 int を 1 つだけ割り当てます。

以下のコードを実行すると、配列の境界を超えているものはすべて上書きされます。

int * pie = new int(7);
pie[6] = 1;

これにより、追跡が困難なランダムなバグが発生する可能性があります。たとえば、ポインタを上書きすると…</p>

詳細: C++ の動的メモリ割り当て

演算子 new および new[]

動的メモリを要求するには、演算子 new を使用します。new の後にはデータ型指定子が続き、
複数の要素のシーケンスが必要な場合は、
角かっこ [] 内のこれらの数が続きます。
割り当てられたメモリの新しいブロックの先頭へのポインタを返します。その形式は次のとおりです。 pointer = new type pointer = new type [number_of_elements] 最初の式は、型 type の 1 つの要素を格納するためにメモリを割り当てるために使用されます。2 番目のものは、型 type の要素のブロック (配列) を割り当てるために使用されます。number_of_elements は、これらの量を表す整数値です。例えば:

int * bobby; 
bobby = new int [5];

この場合、システムは int 型の 5 つの要素に動的にスペースを割り当て、bobby に割り当てられたシーケンスの最初の要素へのポインタを返します。したがって、現在、bobby は int 型の 5 つの要素のためのスペースを持つ有効なメモリ ブロックを指しています。

 

演算子 delete および delete[]

通常、動的メモリの必要性はプログラム内の特定の瞬間に限定されるため、必要がなくなったら解放して、動的メモリの他の要求に対してメモリを再び使用できるようにする必要があります。これが演算子 delete の目的であり、その形式は次のとおりです。

delete pointer;
delete [] pointer;

最初の式は、単一の要素に割り当てられたメモリを削除するために使用し、2 番目の式は要素の配列に割り当てられたメモリを削除するために使用する必要があります。

delete に引数として渡される値は、以前に new で割り当てられたメモリ ブロックへのポインター、または null ポインターでなければなりません (null ポインターの場合、delete は効果をもたらしません)。

于 2013-03-29T20:57:35.703 に答える