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)
我播种了很多空间......
怎么了?这是内存管理的问题吗?
一个.
用向量替换指针:
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)
你不能初始化数组System用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
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)
| 归档时间: |
|
| 查看次数: |
5892 次 |
| 最近记录: |