2

我在访问 std 向量的内存时遇到问题。

我首先定义一个结构(在头文件中):

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

我需要一个系统集合,并且每个向量总和必须包含 num 双精度数,因此,在主要内容中,我写道:

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();

我播种有很多空间......

怎么了?这是内存管理的问题吗?

一个。

4

2 回答 2

6

用向量替换你的指针:

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

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

您无法初始化Systemwith的数组malloc,因为System它不是 POD。它的vector数据成员需要通过构造函数调用来构造。上面的例子解决了这个问题。

请注意,如果你想传递一个指向向量底层数据的指针以使用一些遗留 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

我用“new”替换了“malloc”,它起作用了。

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

这样, system当我调用之前定义的函数时,我仍然可以使用指针。

于 2013-06-27T15:49:35.820 回答