gdb:<错误读取变量>与c ++向量

alt*_*are 1 c++ gdb memory-management stdvector

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

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

typedef struct Systems {
//  other variables...
    vector <double>  sum;
} System;
Run Code Online (Sandbox Code Playgroud)

我需要一个系统集合,每个向量和必须包含num double,所以,在main中,我写道:

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

从我这一点开始使用

System[0].part_sum[0]
Run Code Online (Sandbox Code Playgroud)

初始化向量我收到一个分段错误程序.

如果在gdb我尝试

(gdb) print system[0].part_sum[0]
Run Code Online (Sandbox Code Playgroud)

我明白了:

$2 = (double &) @0x200000003: <error reading variable>
Run Code Online (Sandbox Code Playgroud)

我使用reserve或allocator而不是resize获得相同的错误.我还检查了矢量的容量

cout << system[0].part_sum.capacity();
Run Code Online (Sandbox Code Playgroud)

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

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

一个.

jua*_*nza 5

用向量替换指针:

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

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

你不能初始化数组Systemmalloc,因为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
Run Code Online (Sandbox Code Playgroud)

例如:

void doStuff(System*, unsigned count);

std::vector<System> test(42);
doStuff(test.data(), test.size()); // C++11
doStuff(&test[0], test.size()); // C++03
Run Code Online (Sandbox Code Playgroud)