2017-03-27 3 views
0

配列の呼び出し用の領域を割り当てます。これはdouble型の(2 * n + 1)要素を持ちます。私は配列を作成し、最後にfree()します。しかし私がfree()を使うと、 "double free or corruption(out):0x0000000000000f1dc20"というエラーが出ます。私がfree()にコメントすると、コードが実行されます。私は問題を見つけることができません。C++のmalloc()の後にfree()が呼び出された場合のエラー

using namespace std; 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <math.h> 

long n=512; //grid size 
double *test; 

int main() 
{ 
    test = (double*) malloc(sizeof(double) * (2*n+1)); 

    for (long j=-n;j<=n;j++) 
    { 
     test[j] = double(j); 
    } 

    free(test); //<--- gives me error if I use this 
    return 0; 
} 
+3

これはcとC++の混合です。 C++では 'malloc'と' free'の代わりに 'new'と' delete'を使うべきです。それでも、コンテナと 'std :: make_unique'や' std :: make_shared'を 'new' /' delete'より優先します。さらに、cヘッダは '#include 'の代わりに '#include 'のような接頭辞cを使ってインクルードされます。 –

+5

ここでは、負のインデックスを使用することはできません。 –

+5

C++では 'malloc' /' free'を避けるべきです。 'new' /' delete'は手動メモリ割り当てのためのC++の方法です。つまり、 'std :: vector'、' std :: unique_ptr'、または 'std :: shared_ptr'が望ましいはずです。 – NathanOliver

答えて

3

いいえ、それはしません。

2nの倍数の配列に十分な領域を割り当てますが、Cは[0。2n-1]の範囲の配列インデックスを定義します。 [-n .. + n]を使って要素にアクセスすることは、自由に決めることができません。既にコメントに記載されているように、未定義の動作です。

あなたがやっているように見える何をする必要がある場合は、すべてのアクセス、例えばのためのオフセットを使用する必要がありますが:

test[j+n] = double(j); 

次に、あなたのヒープ構造を破壊しないのより良いチャンスがあなたのCおよび/またはOSメモリマネージャから迷惑なエラーメッセージが出ることがあります。

関連する問題