2

std ベクトルのメモリへのアクセスに問題があります。

最初に (ヘッダー ファイルで) 構造体を定義します。

typedef struct Systems {
//  other variables...
    vector <double>  sum;
} System;

システムのアンサンブルが必要で、各ベクトルの合計には num double が含まれている必要があるため、メインに次のように記述します。

System * system;
system = (System*)malloc(DIM_ENSEMBLE*sizeof(System));
for (i =0; i< DIM_ENSEMBLE; i++) {
//...
system[i].part_sum.resize(num);
//...
}

この時点から、私が使用するとすぐに

System[0].part_sum[0]

ベクトルを初期化するために、セグメンテーション違反プログラムを受け取ります。

gdbの場合、私はしようとします

(gdb) print system[0].part_sum[0]

私は得る:

$2 = (double &) @0x200000003: <error reading variable>

サイズ変更の代わりに予約またはアロケータを使用しても同じエラーが発生します。ベクターの容量もチェックしました

cout << system[0].part_sum.capacity();

たくさんのスペースがあると思います...

何が起こっている?これはメモリ管理の問題ですか?

A.

4

2 に答える 2

6

ポインター t をベクトルに置き換えます。

std::vector<System> system(DIM_ENSEMBLE);

for (i =0; i< system.size(); ++i) {
//...
system[i].part_sum.resize(num);
//...
}

は POD ではないため、 Systemwithの配列を初期化できません。そのデータ メンバーは、コンストラクター呼び出しを介して構築する必要があります。上記の例はそれを処理します。mallocSystemvector

ベクトルの基になるデータへのポインターを渡してレガシー API を使用する場合は、次の方法で取得できます。

const System* cp = system.data(); // or &system[0] if no C++11 
System* p = system.data();        // or &system[0] if no C++11

例えば:

void doStuff(System*, unsigned count);

std::vector<System> test(42);
doStuff(test.data(), test.size()); // C++11
doStuff(&test[0], test.size()); // C++03
于 2013-06-27T15:05:07.403 に答える
1

「malloc」を「new」に置き換えたところ、うまくいきました。

System * system;    
system = new System[DIM_ENSEMBLE];

このようにして、 system以前に定義した関数を呼び出すときに、引き続きポインターを使用できます。

于 2013-06-27T15:49:35.820 に答える